Saya sangat bingung size_t
. Saya telah mencari di internet dan di mana-mana menyebutkan bahwa itu size_t
adalah tipe unsigned jadi, itu hanya mewakili nilai-nilai non-negatif.
Pertanyaan pertama saya adalah: jika digunakan untuk mewakili hanya nilai-nilai non-negatif, kenapa tidak kita gunakan unsigned int
bukan size_t
?
Pertanyaan kedua saya adalah: are size_t
and unsigned int
interchangeable or not? Jika tidak, lalu mengapa?
Dan adakah yang bisa memberi saya contoh yang baik size_t
dan secara singkat cara kerjanya?
typedef /*This part is implementation dependent */ size_t;
Jawaban:
Karena
unsigned int
bukan satu-satunya tipe integer unsigned.size_t
bisa menjadi salahunsigned char
,unsigned short
,unsigned int
,unsigned long
atauunsigned long long
, tergantung pada pelaksanaannya.Mereka tidak dapat dipertukarkan, untuk alasan yang dijelaskan di atas
^^
.Saya tidak mengerti apa yang Anda maksud dengan "pekerjaan singkatnya". Ia bekerja seperti jenis unsigned lainnya (khususnya, seperti jenis yang diketikkannya). Anda didorong untuk menggunakan
size_t
saat Anda menjelaskan ukuran suatu benda. Secara khusus,sizeof
operator dan berbagai fungsi pustaka standar, sepertistrlen()
, returnsize_t
.Bonus: inilah artikel bagus tentang
size_t
(danptrdiff_t
jenis yang terkait erat ). Itu alasan yang sangat baik mengapa Anda harus menggunakannya.sumber
size_t
menjadiunsigned char
? Apakah ini dalam standar yang diperbolehkan? Maksud saya dengan gagasan itu bagaimana orang bisa diharapkan untuk menggunakancalloc()
(dan keluarga),strlen()
dll.? Bagi saya itu tidak masuk akal.size_t
didefinisikan dalam standar sebagai "tipe integer unsigned", tetapi tidak memerlukannya untuk menjadi sama seperti salah satu dariunsigned {char, short, int, long, long long}
.Ada 5 tipe integer unsigned standar di C:
unsigned char
unsigned short
unsigned int
unsigned long
unsigned long long
dengan berbagai persyaratan untuk ukuran dan kisarannya (singkatnya, setiap kisaran jenis adalah bagian dari kisaran jenis berikutnya, tetapi beberapa di antaranya mungkin memiliki kisaran yang sama).
size_t
adalahtypedef
(yaitu, alias) untuk beberapa tipe unsigned, (mungkin salah satu dari yang di atas tapi mungkin tipe integer unsigned yang diperluas , meskipun itu tidak mungkin). Ini adalah tipe yang dihasilkan olehsizeof
operator.Pada satu sistem, mungkin masuk akal untuk digunakan
unsigned int
untuk merepresentasikan ukuran; di sisi lain, mungkin lebih masuk akal untuk menggunakanunsigned long
atauunsigned long long
. (size_t
tidak mungkin menjadi salah satuunsigned char
atauunsigned short
, tetapi itu diizinkan).Tujuan
size_t
adalah untuk meringankan programmer dari keharusan untuk khawatir tentang yang jenis yang telah ditetapkan digunakan untuk mewakili ukuran.Kode yang mengasumsikan
sizeof
hasilunsigned int
tidak akan portabel. Kode yang mengasumsikannya menghasilkan asize_t
lebih cenderung portabel.sumber
unsigned int
.unsigned long
, dll.) yangsize_t
sesuai bergantung pada mesin tempat kode dijalankan? yaitu pada satu arsitektur mesin, itu sesuai denganunsigned int
tetapi pada arsitektur lain itu akan sesuaiunsigned long
, dll?size_t
, terutama jika, misalnya,unsigned long
danunsigned long long
berukuran sama.long
,long long
dll.limits.h
Bergantung pada sistem: Jika Anda perhatikan, setidaknya di bawah Unices, Anda akan melihat bahwa nilai maks untuk int tergantung pada ukuran kata dari sistem.size_t
memiliki batasan tertentu.Mengutip dari http://www.cplusplus.com/reference/cstring/size_t/ :
Itu tidak dapat dipertukarkan dengan
unsigned int
karena ukuranint
ditentukan oleh model data. Misalnya LLP64 menggunakan 32-bitint
dan ILP64 menggunakan 64-bitint
.sumber
size_t digunakan untuk menyimpan ukuran objek data, dan dijamin dapat menampung ukuran objek data apa pun yang dapat dibuat oleh implementasi C tertentu. Tipe data ini mungkin lebih kecil (dalam jumlah bit), lebih besar atau sama persis dengan unsigned int.
sumber
Selain jawaban lain, ia juga mendokumentasikan kode dan memberi tahu orang-orang bahwa Anda berbicara tentang ukuran objek dalam memori
sumber
apple
adalah apel , seorangsize_t
adalah ukuran ...size_t type adalah tipe bilangan bulat unsigned dasar dari bahasa C / C ++. Ini adalah jenis hasil yang dikembalikan oleh operator sizeof. Ukuran tipe dipilih sehingga bisa menyimpan ukuran maksimum dari array yang secara teoritis memungkinkan dari tipe apapun. Pada sistem 32-bit size_t akan mengambil 32 bit, pada 64-bit 64 bit. Dengan kata lain, variabel tipe size_t dapat menyimpan pointer dengan aman. Pengecualiannya adalah pointer ke fungsi kelas tetapi ini adalah kasus khusus. Meskipun size_t dapat menyimpan pointer, lebih baik menggunakan tipe integer unsigned lain uintptr_t untuk tujuan itu (namanya mencerminkan kemampuannya). Jenis size_t dan uintptr_t adalah sinonim. tipe size_t biasanya digunakan untuk penghitung loop, pengindeksan array dan aritmatika alamat. Nilai maksimum yang mungkin dari jenis size_t adalah konstan SIZE_MAX.
sumber
size_t
dapat menyimpan ukuran satu objek. Penunjuk dapat menunjuk ke byte mana pun dari objek apa pun. Anda dapat memiliki sistem dengan, misalnya, ruang alamat 64-bit yang membatasi ukuran satu objek menjadi 2 ** 32-1 byte. Tidak ada jaminan bahwasize_t
danuintptr_t
merupakan tipe yang sama.Dengan kata sederhana size_t adalah platform dan juga tergantung pada implementasi sedangkan unsigned int hanya bergantung pada platform.
sumber