簡體   English   中英

誰能解釋為什么使用size_t類型作為示例?

[英]can anyone explain why size_t type is used with an example?

我想知道為什么在可以使用int類型的地方使用size_t 它說size_tsizeof運算符的返回類型。 這是什么意思? 就像如果我使用sizeof(int)並將其返回的內容存儲到int類型變量中一樣,那么它也可以工作,就不必將其存儲在size_t類型變量中。 我只是想通過一個易於理解的size_t來了解使用size_t的基本概念。

可以保證size_t能夠表示可能的最大大小,而int則不能。 這意味着size_t更便於攜帶。

例如,如果int最多只能存儲255個但您可以分配5000個字節的數組怎么辦? 顯然這是行不通的,但是使用size_t可以。

最簡單的例子是相當日:一個舊的16比特上int系統64 k的RAM,一個的值int可以在任何地方從-32768到32767,但經過:

char buf[40960];

緩沖區buf占用40 KB,因此sizeof buf太大而無法容納int ,因此需要unsigned int

如果您使用32位int但允許程序一次訪問超過4 GB的RAM,今天就會發生同樣的事情,就像所謂的“ I32LP64”模型(32位int ,64位long和指針)。 在這里, size_t類型的范圍與unsigned long范圍相同。

您通常使用size_t將指針轉換為相同大小的無符號整數,以對指針進行計算,就好像它們是整數一樣,否則在編譯時將被阻止。 此類代碼旨在在不同的指針大小(例如32位模型與64位模型)的上下文中正確編譯和構建。

size_t是定義存儲對象大小的typedef。 它可以存儲目標平台支持的最大對象大小。 這使其易於攜帶。

例如:

void * memcpy(void * destination, const void * source, size_t num);

memcpy()將 num個字節從源復制到目標。 可以復制的最大字節數取決於平台。 因此,將num設置size_t類型使memcpy可移植。

有關更多詳細信息,請參閱https://stackoverflow.com/a/7706240/2820412

  1. size_t是基本無符號整數類型之一的typedef。 根據實現的不同,它可以是unsigned int,unsigned long或unsigned long long。
  2. 它的特殊屬性是它可以表示任何對象(還包括最大的對象!)的大小(以字節為單位)。 這是它在標准庫中廣泛用於數組索引和循環計數的原因之一(這也解決了可移植性問題)。 讓我用一個簡單的例子來說明這一點。

考慮一個長度為2 * UINT_MAX的向量,其中UINT_MAX表示無符號int的最大值(對於我的實現,考慮到無符號int為4個字節,則為4294967295)。

std :: vector vec(2 * UINT_MAX,0);

如果要使用這樣的for循環填充向量,則它將無法正常工作,因為unsigned int只能迭代到UINT_MAX點(超過該點它將再次從0開始)。

for(unsigned int i = 0; i <2 * UINT_MAX; ++ i)vec [i] = i;

這里的解決方案是使用size_t,因為可以保證以字節為單位表示任何對象的大小(因此也可以表示矢量vec!)。 請注意,對於我的實現,size_t是無符號long的typedef,因此考慮8個字節,其最大值= ULONG_MAX = 18446744073709551615

for(size_t i = 0; i <2 * UINT_MAX; ++ i)vec [i] = i;

參考: https : //en.cppreference.com/w/cpp/types/size_t

它是實現定義的,但是在64位系統上,您會發現size_t通常為64位,而int仍為32位(除非是ILP64或SILP64模型)。

根據您所使用的體系結構(16位,32位或64位),int的大小可能會有所不同。

如果您想要特定的大小,請使用uint16_t或uint32_t...。您可以查看此線程以獲取更多信息

C ++標准說明int,long類型的大小是什么?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM