Size_t'nin tanımını nerede bulabilirim?


123

Bu tür ile tanımlanmış değişkenler görüyorum ama nereden geldiğini ve amacının ne olduğunu bilmiyorum. Neden int veya işaretsiz int kullanmıyorsunuz? (Ya diğer "benzer" türler? Void_t, vb.).



@kjfletch: hhhmmm, 'size_t' terimini aramanın (daha önce yaptığım gibi) bu soruyu geri getirmemesi garip.
Eliseo Ocampos

1
@Eliseo - Stackoverflow'un arama işlevi berbat. Bunun yerine Google'ı "site: stackoverflow.com" parametresiyle kullanın.
Michael Burr

8
OP özellikle size_t'nin tanımını nerede bulabilirim? Ben de aynı şeyi arayarak buraya indim. Atıfta bulunulan dup, beyanın nerede bulunacağını tartışmaz.
jww

9
Bu soru açıkça bağlantılı olanla aynı soru değildir. "Bir şeyi nerede bulabilirim" , "Aradaki fark nedir" ile aynı şey değildir (birinin yanıtı diğerine yanıt verse bile). Google'da 'c ++, boyut_t tanımı nerede' aramam beni doğrudan buraya götürdü ve diğer soruyu kaçırırdım çünkü farklı .
Dan Nissenbaum

Yanıtlar:


122

Gönderen Wikipedia

stdlib.hVe stddef.hbaşlık dosyaları olarak adlandırılan bir veri türü tanımlayan size_t1 bir nesnenin boyut temsil etmek için kullanılır. Boyutları alan kitaplık işlevleri, bunların türde olmalarını bekler size_tve sizeof işleci değerlendirir size_t.

Gerçek türü size_tplatforma bağlıdır; Yaygın bir hata, size_tişaretsiz int ile aynı olduğunu varsaymaktır , bu da programlama hatalarına neden olabilir, 2, özellikle 64 bit mimariler daha yaygın hale geldikçe.

Gönderen C99 7.17.1 / 2

Aşağıdaki tipler ve makrolar standart başlıkta tanımlanmıştır stddef.h

<Kesik>

size_t

sizeof operatörünün sonucunun işaretsiz tamsayı türüdür


2
Örneğin, Win64 ile, intve unsigned intsize_t 64 bit ise tip 32 bit vardır.
Michael Burr

7
Lütfen ISO C (99) standardına (C ++ standardının dahil olduğu) bölüm 7.17 ve 7.18.3
Martin York

3
@LokiAstari Standartta nerede yazıldığını bildiğinize göre neden cevabı düzenlemiyorsunuz?
Hi-Angel

Peki C ++ yanıtı nerede?
Lothar

@Lothar Bence tek fark size_t bir anahtar kelime olabilir, aksi takdirde aynı anlama gelir.
Paul Stelian

30

En.cppreference.com'daki size_t açıklamasına göre size_taşağıdaki başlıklarda tanımlanmıştır:

std::size_t

...    

Defined in header <cstddef>         
Defined in header <cstdio>      
Defined in header <cstring>         
Defined in header <ctime>       
Defined in header <cwchar>

2
Bu tam olarak ihtiyacım olan şey, bu cevaba olumlu oy verilmelidir.
neodelphi

27

size_t sizeof operatörünün sonucunun işaretsiz tamsayı türüdür (ISO C99 Bölüm 7.17.)

sizeofOperatör bir ekspresyon ya da bir tür parantez içinde adı olabilir onun işlenen (bayt) boyutu, elde edilir. Boyut, işlenenin türüne göre belirlenir. Sonuç bir tamsayıdır. Sonucun değeri uygulama tanımlıdır ve türü (işaretsiz tam sayı türü) size_t(ISO C99 Bölüm 6.5.3.4.)


Standarttan alıntı yaptığı için en iyi cevap.
Martin York

1
@Martin - yeterince doğru, ancak sorunun 'neden işaretsiz int kullanılmıyor' kısmının 'size_t nedir' kısmı kadar ilginç (veya daha fazla) olduğunu düşünüyorum ve bunu standartta bulamayacaksınız .
Michael Burr

Evet, "Bölüm 17.17 " olmaması dışında : s. Nadirdir, kimse Void_t hakkında tek bir kelime bile etmedi
Eliseo Ocampos

Bu yanıtı doğrudan soruyu yanıtladığı için kabul ediyorum, ancak Michael'ın cevabıyla iltifat edilirse harika olur.
Eliseo Ocampos

58
Yazık ki cevabınız bana hangi başlık dosyasını dahil edeceğimi söylemiyor.
Matt

6

Pratik olarak size_t, adresleyebileceğiniz bayt sayısını temsil eder. Son 10-15 yıldır çoğu modern mimaride, bu aynı zamanda işaretsiz bir int boyutunda olan 32 bittir. Bununla birlikte uint, büyük olasılıkla 32 bitte kalırken 64 bit adreslemeye geçiyoruz (boyutu c ++ standardında garanti edilmemektedir). Mimariler arasında bellek boyutuna bağlı olan kodunuzu taşınabilir hale getirmek için bir size_t. Örneğin, dizi boyutları gibi şeyler her zaman size_t's kullanmalıdır . Standart kaplara bakarsanız, ::size()her zaman bir size_t.

Ayrıca, visual studio'nun "64-bit Taşınabilirlik Sorunlarını Algıla" adı verilen bu tür hataları kontrol edebilen bir derleme seçeneğine sahip olduğunu unutmayın.


2

Bu şekilde, her zaman boyutun ne olduğunu bilirsiniz, çünkü belirli bir tür, boyutlara adanmıştır. Kendi sorusu bunun bir sorun olabileceğini gösteriyor: bu intbir unsigned intmi yoksa bir mi? Ayrıca, büyüklüğü nedir ( short, int, longvs.)?

Atanmış belirli bir tür olduğundan, uzunluk veya imzalılık konusunda endişelenmenize gerek yoktur.

Gerçek tanım C ++ Referans Kitaplığı'nda bulunabilir , şöyle ki:

Tür: size_t(İşaretsiz integral türü)

Başlık: <cstring>

size_tdil operatörü tarafından döndürülen integral veri tipine karşılık gelir sizeofve <cstring>başlık dosyasında (diğerleri arasında) işaretsiz integral tipi olarak tanımlanır.

Olarak <cstring>, bu parametrenin türü olarak kullanıldığı numfonksiyonlarda memchr, memcmp, memcpy, memmove, memset, strncat, strncmp, strncpyve strxfrmher durumda bayt veya işlev etkileyecek zorundadır maksimum karakter sayısını belirtmek için kullanılan.

Ayrıca, dönüş türü olarak kullanılan strcspn, strlen, strspnve strxfrmgeri dönüş boyutları ve uzunlukları.


2

size_t, standart kitaplığınızın başlıklarında tanımlanmalıdır. Tecrübelerime göre, genellikle unsigned int için bir typedef. Mesele şu ki, olması gerekmiyor. Size_t gibi türler, standart kitaplık satıcısına, platforma uygunsa temel veri türlerini değiştirme özgürlüğü sağlar. Size_t'nin her zaman işaretsiz int olduğunu varsayarsanız (çevrim yoluyla, vb.), Satıcınız size_t'yi örneğin 64 bitlik bir tür olarak değiştirirse gelecekte sorunlarla karşılaşabilirsiniz. Bu nedenle, bu veya başka bir kitaplık türü hakkında herhangi bir şey varsaymak tehlikelidir.


1

void_tBir Google araması dışında aşina değilim ( AT&T Research'te Kiem-Phong Vo tarafından bir vmallockütüphanede kullanılıyor - eminim diğer kütüphanelerde de kullanılıyor).

Belirli şeyler için kullanılan somut türler bir platformdan diğerine farklılık gösterebileceğinden, çeşitli xxx_t typedef'leri bir türü belirli bir kesin uygulamadan soyutlamak için kullanılır. Örneğin:

  • size_t, nesnelerin boyutunu tutmak için kullanılan türü özetler çünkü bazı sistemlerde bu 32 bitlik bir değerdir, diğerlerinde 16 bit veya 64 bit olabilir.
  • Void_tAnahtar kelimenin bulunmayabileceği vmallocANSI / ISO C'yi önceden tarihlendiren sistemlerde çalışmak üzere yazıldığı için kütüphane rutinleri tarafından döndürülen işaretçi tipini özetler void. En azından tahmin ettiğim buydu.
  • wchar_t Geniş karakterler için kullanılan türü özetler, çünkü bazı sistemlerde 16 bitlik bir tür, diğerlerinde ise 32 bitlik bir tür olacaktır.

Bu nedenle, geniş karakter işleme kodunuzu wchar_t, diyelim ki yerine türü kullanmak için yazarsanız unsigned short, bu kod muhtemelen çeşitli platformlara daha taşınabilir olacaktır.


Bu kısmen aradığım şeydi. Ben fpmurphy yanıtında bir yorumda dediği gibi, o (belki sakıncası yoksa bunu düzenleyebilirsiniz) :) Bu yanıt ile tamamlanabilir bu harika olurdu
Eliseo'da Ocampos

1

Bir size_ttanımın "tesadüfen" yüklenmediği minimalist programlarda , bazıları içerir, ancak yine de bir bağlamda (örneğin erişim için std::vector<double>) buna ihtiyacım var , sonra bu bağlamı doğru türü çıkarmak için kullanırım . Örneğin typedef std::vector<double>::size_type size_t.

( namespace {...}Gerekirse kapsamı sınırlandırmak için kuşatın .)


1

"Neden int veya işaretsiz int kullanılmasın?" Gelince, çünkü anlamsız olarak daha anlamlı olmadığı için. Olmasının pratik bir nedeni var, diyelim ki,typedef kimsenin kodunu değiştirmesine gerek kalmadan, örneğin bir d olarak intve sonra daha sonra yükseltilebilmesininlong , elbette, ama bundan daha temelde bir türün anlamlı olması gerekiyor. Büyük ölçüde basitleştirmek size_tiçin, time_tzaman değerlerini içermek için uygun olduğu gibi , nesnelerin boyutlarını içeren bir tür değişkeni uygundur ve bunlar için kullanılır . Bunların gerçekte nasıl uygulandığı, uygulamanın işi olmalıdır. Her şeyi intaramakla karşılaştırıldığında , bunun gibi anlamlı tip adları kullanmak, programınızın anlamını ve amacını netleştirmeye yardımcı olur, tıpkı herhangi bir zengin tür kümesinin yaptığı gibi.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.