標籤:

cout << sizeof(vector<int>);輸出是32,為什麼?


按 std::vector - cppreference.com 所提供的功能,可以知道實現時最少需要儲存:

  1. 一個指針
  2. 一個表示 capacity 的 size_t (或用指針代表結束位置)
  3. 一個表示 size 的 size_t (或用指針代表結束位置)
  4. 一個 Allocator 對象

在一般64位平台上,指針和 size_t 都是 8 個位元組。如果 Allocator 少於等於 8 個位元組,並且要令其他成員變數做8位元組對齊,就會加上 padding。那麼 sizeof 這個類型可能就是 8 × 4 = 32。

具體大小是平台相關,不是標準。


打開STL源代碼看一眼,把成員加一加,算上內存對齊的padding,就可以了。


要看具體的STL庫的實現和平台。在32位操作系統和gcc下,

sizeof(std::vector&)

列印12。見http://ideone.com/2ngrFn。

在64位系統下就列印24:

查看gcc 4.6.3 的實現:

template& &>
class vector : protected _Vector_base&<_Tp, _Alloc&> {
// no member variable
}

可以看到class vector繼承 _Vector_base,並沒有添加新的類成員變數。

template&
struct _Vector_base {
public:
_Vector_impl _M_impl;
}

裡面有一個成員變數_Vector_impl。

struct _Vector_impl : public _Tp_alloc_type {
pointer _M_start;
pointer _M_finish;
pointer _M_end_of_storage;
}

裡面包含了3個指針。

32位平台上每個指針是4個位元組。3個指針就是12個位元組了。

3個指針排列的非常好,沒有額外的位元組對齊開銷。

vector繼承_Vector_base,2個類都沒有虛函數,就沒有額外的虛函數表開銷。

所以綜上,算起來總共是12個位元組的開銷。

PS: gcc對vector實現的源代碼:

https://gcc.gnu.org/onlinedocs/gcc-4.6.3/libstdc++/api/a01069_source.html#l00217


這個32取決於具體的實現,不同平台,不同編譯器很可能這個值不一樣,這個屬於庫的實現細節,沒必要關心。


iterator start;

iterator finish;

iterator end_of_storage;

3*8 = 24.


你再把vector填入100個元素會發現它的sizeof也沒變

為什麼?嘗試用純c實現一遍vector您就明白了


這和具體的STL庫實現方式和平台有關了,vector其實是一個模板,vector&是一個特化了的模板類


推薦閱讀:

如何用 VS 2013 打包 VC++ 程序?
設計C++函數傳參時如何決定使用指針還是引用?
C++的編譯單元要知道所有的實現?
switch語句中,case的後面為什麼必須是常量?
C/C++ 中怎樣優雅的寫多判斷 if 語句?

TAG:C |