Di mana saya bisa menemukan definisi size_t?

123

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).

Eliseo Ocampos
sumber
Pertanyaan Tepat: stackoverflow.com/questions/502856/…
kjfletch
@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 .
Dan Nissenbaum

Jawaban:

122

Dari Wikipedia

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.

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

Martin Liversage
sumber
2
Misalnya, di Win64, intdan unsigned inttipe adalah 32 bit, sedangkan size_t adalah 64 bit.
Michael Burr
7
Silakan merujuk ke standar ISO C (99) (dari mana standar C ++ termasuk) bagian 7.17 dan 7.18.3
Martin York
3
@LokiAstari kenapa tidak kamu edit saja jawabannya karena kamu tahu di mana tertulis dalam standar?
Hi-Angel
Jadi dimana jawaban C ++?
Lothar
@Lothar Saya pikir satu-satunya perbedaan adalah size_t itu mungkin kata kunci, dan sebaliknya memiliki arti yang sama.
Paul Stelian
30

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>
StefanB
sumber
2
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.)

fpmurphy.dll
sumber
Jawaban terbaik karena mengutip standar.
Martin York
1
@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".

Harga Matt
sumber
2

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 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.

lavinio
sumber
2

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.

Ryan
sumber
1

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:

  • 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.

Michael Burr
sumber
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.)

alfC
sumber
1

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.

Crowman
sumber