[英]The operation of the sizeof operator in C++
在我的MS VS 2015編譯器上, int
的sizeof
為4(字節)。 但是sizeof
vector<int>
值為16。據我所知, 向量在尚未初始化時就像一個空盒子,所以為什么它是16? 為什么是16,而不是另一個數字?
此外,如果我們有vector<int> v(25);
然后使用int數字對其進行初始化,盡管v
具有25個int
數字,但v
的大小仍為16! 每個int
的大小是4,因此v
的sizeof
看似應該是25 * 4字節,但實際上它仍然是16! 為什么?
std::vector
通常是一個包含兩個元素的結構:其元素的指針(數組)和數組的大小(元素數)。
由於size
為sizeof(void *)
並且指針也是sizeof(void *)
,因此結構的大小為2*sizeof(void *)
,即16
。
元素的數量與大小無關,因為元素是在堆上分配的。
編輯:正如MM所提到的,實現可能有所不同,例如指針, start
, end
, allocatedSize
。 因此,在32位環境中,應為3*sizeof(size_t)+sizeof(void *)
,此處可能是這種情況。 即使原始文件也可以將start
硬編碼為0,並通過masking end
計算出allocatedSize
,因此它實際上取決於實現。 但是,重點仍然是相同的。
sizeof
是在編譯時求值的,因此它僅計算在類中聲明的變量的大小,該類可能包括幾個計數器和一個指針。 指針指向的是隨大小變化的,但是編譯器對此並不了解。
可以使用以下指針來解釋大小:1)向量的開始2)向量的結束和3)向量的容量。 因此,它更像依賴於實現,並且會因不同的實現而改變。
您似乎正在將“數組”與“向量”混合在一起。 如果您有本地數組,則sizeof將確實提供數組的大小。 但是,向量不是數組。 它是一類,來自STL的容器,可確保內存內容位於單個內存塊中(如果向量增加,則可能會對其進行重定位)。
現在,如果您看一下std :: vector實現,您會發現它包含字段(至少在MSVC 14.0中):
size_type _Count = 0;
typename _Alloc_types::_Alty _Alval; // allocator object (from base)
_Mylast
_Myfirst
根據您的實現,這可能總計16個字節(注意:經驗可能會有所不同)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.