cout << sizeof(vector<int>);輸出是32,為什麼?
按 std::vector - cppreference.com 所提供的功能,可以知道實現時最少需要儲存:
- 一個指針
- 一個表示 capacity 的 size_t (或用指針代表結束位置)
- 一個表示 size 的 size_t (或用指針代表結束位置)
- 一個 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: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 |