2013-10-15 44 views
1

如果我有結構是std :: vector保證不會在元素之間留下空隙?

struct three 
{ 
    char a,b,c; 
}; 

和我使用的編譯器編譯指示來確保的sizeof三是3它保證如果我有vector<three> 它不會插入元素之間的差距? 又名 是 vec.data()不會是這樣的:

abc_abc_abc_abc_abc_(_是空的空間)

+0

這是不能保證,存在硬件不能訪問一個對象不正確對齊 –

回答

1

這是由「連續存儲」條件保證。它被添加到C++ 03中的標準中,儘管它在這之前已經很普遍。它說的話的效果爲0 <= n < vec.size(),&vec[n] == &vec[0] + n

由於&vec[0]的類型爲T*,只有當連續元素之間的字節差等於sizeof(T)時才適用。

3

不,那種沒有什麼語言標準保證,而且編譯是編譯器的依賴性。檢查你的編譯器手冊編譯器是否做出任何保證。

但是,您可以檢查sizeof(three),以確定佈局是否符合您的要求。數組(和vector中的元素)沒有外部間隔,所以如果這個值是3,那麼你很好。

+0

好吧,所以如果sizeof(三)== 3我很好嗎? – NoSenseEtAl

+1

@NoSenseEtAl:是的,數組的佈局沒有元素間的空隙,每個元素佔用'sizeof(T)'字節。唯一的數據差距可能來自結構末端的內部填充,您可以從更大的尺寸中看出。 –

3

它將以與結構數組相同的方式進行佈局。

然而,數組佈局將取決於您的實現如何對齊和填充此結構;你可以通過查看sizeof(three)來得知它是如何實現的。

一些編譯器將允許您更改對齊和填充用編譯指示或屬性,但它很少是一個好主意,因爲編譯器製造商通常會嘗試使用最佳的比(基於速度和內存開銷)

相關問題