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).
@kjfletch: hhhmmm, aneh rasanya mencari istilah 'size_t' (seperti yang saya lakukan sebelumnya) tidak menghasilkan pertanyaan itu.
Eliseo Ocampos
1
@Eliseo - Fungsi pencarian Stackoverflow buruk. Gunakan Google dengan parameter 'site: stackoverflow.com' sebagai gantinya.
Michael Burr
8
OP secara khusus menanyakan Di mana saya dapat menemukan definisi size_t? Saya mendarat di sini mencari hal yang sama. Dup yang dikutip tidak membahas di mana menemukan deklarasi tersebut.
jww
9
Pertanyaan ini jelas bukan pertanyaan yang sama dengan pertanyaan yang terkait. "Di mana saya menemukan sesuatu" tidak sama dengan "Apa perbedaan antara" (meskipun jawaban satu memberikan jawaban kepada yang lain). Pencarian Google saya untuk 'c ++ where is size_t definition' membawa saya langsung ke sini, dan saya akan melewatkan pertanyaan lain, karena ini berbeda .
The stdlib.hdan stddef.hfile header menentukan datatype disebut size_t1 yang digunakan untuk mewakili ukuran dari sebuah objek. Fungsi pustaka yang mengambil ukuran mengharapkannya menjadi tipe size_t, dan ukuran operator mengevaluasi size_t.
Jenis sebenarnya dari size_tbergantung pada platform; kesalahan umum adalah menganggapnya size_tsama dengan unsigned int, yang dapat menyebabkan kesalahan pemrograman, 2 terutama karena arsitektur 64-bit menjadi lebih umum.
Inilah yang saya butuhkan, jawaban ini harus diberi suara positif.
neodelphi
27
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.)
@Martin - cukup benar, tapi saya pikir bagian 'why not unsigned int used' dari pertanyaan itu semenarik (atau lebih) seperti bagian 'what is size_t', dan Anda tidak akan menemukannya di standar .
Michael Burr
Ya, kecuali tidak ada 'Bagian 17.17 ': p. Jarang, tidak ada yang mengatakan sepatah kata pun tentang Void_t
Eliseo Ocampos
Saya menerima jawaban ini karena menjawab pertanyaan secara langsung, tapi alangkah baiknya jika dipuji dengan jawaban Michael.
Eliseo Ocampos
58
Sayang jawaban Anda tidak memberi tahu saya file header apa yang harus disertakan.
Matt
6
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.
Jenis: size_t(Tipe integral tidak bertanda tangan)
Tajuk: <cstring>
size_tsesuai dengan tipe data integral yang dikembalikan oleh operator bahasa sizeofdan didefinisikan dalam <cstring>file header (antara lain) sebagai tipe integral tak bertanda tangan.
Dalam <cstring>, digunakan sebagai jenis parameter numdalam fungsi memchr, memcmp, memcpy, memmove, memset, strncat, strncmp, strncpydan strxfrm, 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, strspndan strxfrmuntuk 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.
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:
size_t mengabstraksi tipe yang digunakan untuk menampung ukuran objek karena pada beberapa sistem ini akan menjadi nilai 32-bit, pada sistem lain mungkin 16-bit atau 64-bit.
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.
Ini sebagian yang saya cari. Seperti yang saya katakan dalam komentar di jawaban fpmurphy, alangkah baiknya dapat dilengkapi dengan jawaban ini (Jika Anda tidak keberatan mungkin Anda bisa mengeditnya) :)
Eliseo Ocampos
1
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.
Jawaban:
Dari Wikipedia
Dari C99 7.17.1 / 2
sumber
int
danunsigned 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:sumber
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) adalahsize_t
(ISO C99 Bagian 6.5.3.4.)sumber
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 sementarauint
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 filesize_t
. Misalnya hal-hal seperti ukuran array harus selalu menggunakansize_t
s. Jika Anda melihat kontainer standar,::size()
selalu mengembalikan asize_t
.Perhatikan juga, studio visual memiliki opsi kompilasi yang dapat memeriksa jenis kesalahan ini yang disebut "Deteksi Masalah Portabilitas 64-bit".
sumber
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 anunsigned 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:
sumber
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.
sumber
Saya tidak akrab dengan
void_t
kecuali sebagai hasil dari pencarian Google (itu digunakan dalam sebuahvmalloc
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 olehvmalloc
rutinitas perpustakaan karena itu ditulis untuk bekerja pada sistem yang ANSI / ISO C pra-tanggal di manavoid
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, katakanlahunsigned short
, kode itu mungkin akan lebih portabel ke berbagai platform.sumber
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 aksesstd::vector<double>
), maka saya menggunakan yang konteks untuk mengekstrak jenis yang tepat. Misalnyatypedef std::vector<double>::size_type size_t
.(Dikelilingi
namespace {...}
jika perlu untuk membuat ruang lingkup terbatas.)sumber
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 sebagaiint
dan kemudian ditingkatkan kelong
nanti, tanpa ada yang harus mengubah kode mereka, tentu saja, tetapi yang lebih mendasar daripada tipe yang seharusnya bermakna. Untuk menyederhanakan, variabel tipesize_t
cocok untuk, dan digunakan untuk, berisi ukuran benda, sama sepertitime_t
cocok untuk memuat nilai waktu. Bagaimana ini sebenarnya diterapkan harus dengan benar menjadi tugas implementasi. Dibandingkan hanya memanggil semuanyaint
, menggunakan nama jenis yang bermakna seperti ini membantu memperjelas arti dan maksud program Anda, seperti yang dilakukan oleh kumpulan jenis kaya lainnya.sumber