簡體   English   中英

C ++中sizeof運算符的操作

[英]The operation of the sizeof operator in C++

在我的MS VS 2015編譯器上, intsizeof為4(字節)。 但是sizeof vector<int>值為16。據我所知, 向量在尚未初始化時就像一個空盒子,所以為什么它是16? 為什么是16,而不是另一個數字?

此外,如果我們有vector<int> v(25); 然后使用int數字對其進行初始化,盡管v具有25個int數字,但v的大小仍為16! 每個int的大小是4,因此vsizeof看似應該是25 * 4字節,但實際上它仍然是16! 為什么?

每個int的大小是4,因此v的大小看似應該是25 * 4字節,但實際上它仍然是16! 為什么?

您混淆sizeof(std::vector)std::vector::size() ,前者將返回vector本身的大小,不包括其持有的元素的大小。 后者將返回元素的數量,您可以通過std::vector::size() * sizeof(int)獲得所有元素的大小。

那為什么是16? 為什么是16,而不是另一個數字?

什么是sizeof(std::vector)取決於實現 ,通常使用三個指針來實現 在某些情況下(例如調試模式),為方便起見,大小可能會增加。

std::vector通常是一個包含兩個元素的結構:其元素的指針(數組)和數組的大小(元素數)。

由於sizesizeof(void *)並且指針也是sizeof(void *) ,因此結構的大小為2*sizeof(void *) ,即16

元素的數量與大小無關,因為元素是在堆上分配的。

編輯:正如MM所提到的,實現可能有所不同,例如指針, startendallocatedSize 因此,在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.

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