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.hdanstddef.hfile header menentukan datatype disebutsize_t1 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_tbergantung pada platform; kesalahan umum adalah menganggapnyasize_tsama 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_tyang merupakan tipe integer unsigned dari hasil sizeof operator
intdan unsigned inttipe 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 sizeofOperator 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_tmewakili 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 uintkemungkinan 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_ts. 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 intatau 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_tsesuai dengan tipe data integral yang dikembalikan oleh operator bahasasizeofdan didefinisikan dalam<cstring>file header (antara lain) sebagai tipe integral tak bertanda tangan.Dalam
<cstring>, digunakan sebagai jenis parameternumdalam fungsimemchr,memcmp,memcpy,memmove,memset,strncat,strncmp,strncpydanstrxfrm, 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,strspndanstrxfrmuntuk 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_tkecuali sebagai hasil dari pencarian Google (itu digunakan dalam sebuah vmallocperpustakaan 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_tabstrak tipe pointer yang dikembalikan oleh vmallocrutinitas perpustakaan karena itu ditulis untuk bekerja pada sistem yang ANSI / ISO C pra-tanggal di mana voidkata 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_ttipe alih-alih, katakanlah unsigned short, kode itu mungkin akan lebih portabel ke berbagai platform.
Dalam program minimalis di mana size_tdefinisi 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, typedefd sebagai intdan kemudian ditingkatkan ke longnanti, tanpa ada yang harus mengubah kode mereka, tentu saja, tetapi yang lebih mendasar daripada tipe yang seharusnya bermakna. Untuk menyederhanakan, variabel tipe size_tcocok untuk, dan digunakan untuk, berisi ukuran benda, sama seperti time_tcocok 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.