如果我有結構是std :: vector保證不會在元素之間留下空隙?
struct three
{
char a,b,c;
};
和我使用的編譯器編譯指示來確保的sizeof三是3它保證如果我有vector<three>
它不會插入元素之間的差距? 又名 是 vec.data()
不會是這樣的:
abc_abc_abc_abc_abc_(_是空的空間)
如果我有結構是std :: vector保證不會在元素之間留下空隙?
struct three
{
char a,b,c;
};
和我使用的編譯器編譯指示來確保的sizeof三是3它保證如果我有vector<three>
它不會插入元素之間的差距? 又名 是 vec.data()
不會是這樣的:
abc_abc_abc_abc_abc_(_是空的空間)
這是由「連續存儲」條件保證。它被添加到C++ 03中的標準中,儘管它在這之前已經很普遍。它說的話的效果爲0 <= n < vec.size()
,&vec[n] == &vec[0] + n
。
由於&vec[0]
的類型爲T*
,只有當連續元素之間的字節差等於sizeof(T)
時才適用。
不,那種沒有什麼語言標準保證,而且編譯是編譯器的依賴性。檢查你的編譯器手冊編譯器是否做出任何保證。
但是,您可以檢查sizeof(three)
,以確定佈局是否符合您的要求。數組(和vector
中的元素)沒有外部間隔,所以如果這個值是3,那麼你很好。
好吧,所以如果sizeof(三)== 3我很好嗎? – NoSenseEtAl
@NoSenseEtAl:是的,數組的佈局沒有元素間的空隙,每個元素佔用'sizeof(T)'字節。唯一的數據差距可能來自結構末端的內部填充,您可以從更大的尺寸中看出。 –
它將以與結構數組相同的方式進行佈局。
然而,數組佈局將取決於您的實現如何對齊和填充此結構;你可以通過查看sizeof(three)
來得知它是如何實現的。
一些編譯器將允許您更改對齊和填充用編譯指示或屬性,但它很少是一個好主意,因爲編譯器製造商通常會嘗試使用最佳的比(基於速度和內存開銷)
這是不能保證,存在硬件不能訪問一個對象不正確對齊 –