Saya melihat variabel yang didefinisikan dengan tipe ini tetapi saya tidak tahu dari mana asalnya, atau apa tujuannya. Mengapa tidak menggunakan int atau unsigned int? (Bagaimana dengan jenis "serupa" lainnya? Void_t, dll).
Saya melihat variabel yang didefinisikan dengan tipe ini tetapi saya tidak tahu dari mana asalnya, atau apa tujuannya. Mengapa tidak menggunakan int atau unsigned int? (Bagaimana dengan jenis "serupa" lainnya? Void_t, dll).
Jawaban:
Dari Wikipedia
The
stdlib.h
danstddef.h
file header menentukan datatype disebutsize_t
1 yang digunakan untuk mewakili ukuran dari sebuah objek. Fungsi pustaka yang mengambil ukuran mengharapkannya menjadi tipesize_t
, dan ukuran operator mengevaluasisize_t
.Jenis sebenarnya dari
size_t
bergantung pada platform; kesalahan umum adalah menganggapnyasize_t
sama dengan unsigned int, yang dapat menyebabkan kesalahan pemrograman, 2 terutama karena arsitektur 64-bit menjadi lebih umum.
Dari C99 7.17.1 / 2
Jenis dan makro berikut ditentukan di header standar
stddef.h
<snip>
size_t
yang merupakan tipe integer unsigned dari hasil sizeof operator
int
dan unsigned int
tipe adalah 32 bit, sedangkan size_t adalah 64 bit.
Menurut deskripsi size_t di en.cppreference.com size_t
didefinisikan dalam tajuk berikut:
std::size_t
...
Defined in header <cstddef>
Defined in header <cstdio>
Defined in header <cstring>
Defined in header <ctime>
Defined in header <cwchar>
size_t
adalah tipe integer unsigned dari hasil sizeof operator (ISO C99 Bagian 7.17.)
The sizeof
Operator menghasilkan ukuran (dalam bytes) dari operan, yang mungkin merupakan ekspresi atau nama kurung dari tipe. Ukurannya ditentukan dari jenis operannya. Hasilnya adalah bilangan bulat. Nilai dari hasil adalah implementasi-definisi, dan tipenya (tipe integer unsigned) adalah size_t
(ISO C99 Bagian 6.5.3.4.)
Secara praktis size_t
mewakili jumlah byte yang dapat Anda atasi. Pada sebagian besar arsitektur modern selama 10-15 tahun terakhir adalah 32 bit yang juga berukuran int unsigned. Namun kami pindah ke pengalamatan 64bit sementara uint
kemungkinan besar akan tetap di 32bits (ukurannya tidak dijamin dalam standar c ++). Untuk membuat kode yang bergantung pada ukuran memori portabel di seluruh arsitektur, Anda harus menggunakan file size_t
. Misalnya hal-hal seperti ukuran array harus selalu menggunakan size_t
s. Jika Anda melihat kontainer standar, ::size()
selalu mengembalikan a size_t
.
Perhatikan juga, studio visual memiliki opsi kompilasi yang dapat memeriksa jenis kesalahan ini yang disebut "Deteksi Masalah Portabilitas 64-bit".
Dengan cara ini Anda selalu tahu apa ukurannya, karena jenis tertentu didedikasikan untuk ukuran. Pertanyaannya sendiri menunjukkan bahwa ini bisa menjadi masalah: apakah itu an int
atau an unsigned int
? Juga, apa yang besarnya ( short
, int
, long
, dll)?
Karena ada tipe tertentu yang ditetapkan, Anda tidak perlu mengkhawatirkan panjang atau penandatanganannya.
Definisi sebenarnya dapat ditemukan di C ++ Reference Library , yang menyatakan:
Jenis:
size_t
(Tipe integral tidak bertanda tangan)Tajuk:
<cstring>
size_t
sesuai dengan tipe data integral yang dikembalikan oleh operator bahasasizeof
dan didefinisikan dalam<cstring>
file header (antara lain) sebagai tipe integral tak bertanda tangan.Dalam
<cstring>
, digunakan sebagai jenis parameternum
dalam fungsimemchr
,memcmp
,memcpy
,memmove
,memset
,strncat
,strncmp
,strncpy
danstrxfrm
, yang dalam semua kasus itu digunakan untuk menentukan jumlah maksimal byte atau karakter fungsi memiliki mempengaruhi.Hal ini juga digunakan sebagai jenis kembali untuk
strcspn
,strlen
,strspn
danstrxfrm
untuk ukuran kembali dan panjang.
size_t harus ditentukan di header perpustakaan standar Anda. Dalam pengalaman saya, biasanya hanya sebuah typedef ke unsigned int. Intinya, bagaimanapun, adalah bahwa itu tidak harus demikian. Jenis seperti size_t memungkinkan vendor perpustakaan standar kebebasan untuk mengubah tipe data yang mendasarinya jika sesuai untuk platform. Jika Anda menganggap size_t selalu unsigned int (melalui casting, dll), Anda dapat mengalami masalah di masa mendatang jika vendor Anda mengubah size_t menjadi misalnya tipe 64-bit. Berbahaya untuk mengasumsikan apa pun tentang ini atau jenis pustaka lainnya karena alasan ini.
Saya tidak akrab dengan void_t
kecuali sebagai hasil dari pencarian Google (itu digunakan dalam sebuah vmalloc
perpustakaan dengan Kiem-Phong Vo di AT & T Penelitian - saya yakin itu digunakan di perpustakaan lain juga).
Berbagai xxx_t typedef digunakan untuk mengabstraksi tipe dari implementasi pasti tertentu, karena tipe konkret yang digunakan untuk hal-hal tertentu mungkin berbeda dari satu platform ke platform lainnya. Sebagai contoh:
Void_t
abstrak tipe pointer yang dikembalikan oleh vmalloc
rutinitas perpustakaan karena itu ditulis untuk bekerja pada sistem yang ANSI / ISO C pra-tanggal di mana void
kata kunci mungkin tidak ada. Setidaknya itulah yang saya duga.wchar_t
abstrak tipe yang digunakan untuk karakter lebar karena pada beberapa sistem akan menjadi tipe 16 bit, pada yang lain akan menjadi tipe 32 bit.Jadi jika Anda menulis kode penanganan karakter lebar Anda untuk menggunakan wchar_t
tipe alih-alih, katakanlah unsigned short
, kode itu mungkin akan lebih portabel ke berbagai platform.
Dalam program minimalis di mana size_t
definisi itu tidak dimuat "secara kebetulan" di beberapa meliputi tapi aku masih membutuhkannya dalam beberapa konteks (misalnya untuk akses std::vector<double>
), maka saya menggunakan yang konteks untuk mengekstrak jenis yang tepat. Misalnya typedef std::vector<double>::size_type size_t
.
(Dikelilingi namespace {...}
jika perlu untuk membuat ruang lingkup terbatas.)
Adapun "Mengapa tidak menggunakan int atau unsigned int?", Hanya karena secara semantik lebih berarti untuk tidak melakukannya. Ada alasan praktis yang bisa, katakanlah, typedef
d sebagai int
dan kemudian ditingkatkan ke long
nanti, tanpa ada yang harus mengubah kode mereka, tentu saja, tetapi yang lebih mendasar daripada tipe yang seharusnya bermakna. Untuk menyederhanakan, variabel tipe size_t
cocok untuk, dan digunakan untuk, berisi ukuran benda, sama seperti time_t
cocok untuk memuat nilai waktu. Bagaimana ini sebenarnya diterapkan harus dengan benar menjadi tugas implementasi. Dibandingkan hanya memanggil semuanya int
, menggunakan nama jenis yang bermakna seperti ini membantu memperjelas arti dan maksud program Anda, seperti yang dilakukan oleh kumpulan jenis kaya lainnya.