在結構/類的常見情況下,成員之間可能會有對齊填充。但我想知道這是否是安全的假設,這種特殊情況:相同類型的數組成員之後的對齊
template<typename T, size_t N>
struct MyStruct {
T data[N];
T term;
constexpr MyStruct();
};
將是這個可靠的等價物:
template<typename T, size_t N>
struct MyStruct {
T data[N+1];
constexpr MyStruct();
};
之所以問的是什麼其實我想要的是能夠在constexpr構造函數中顯式初始化數組的最後一個成員(但我不關心其餘部分)。例如與頂級MYSTRUCT我可以這樣做:
template<typename T, size_t N>
constexpr MyStruct<T,N>::MyStruct() : data{}, term{0} {}
但我希望得到的結果是一樣的,如果長期是真的數組的最後一個元素。
這是安全嗎?如果沒有,是否有辦法使用MyStruct的第二種形式來實現相同的功能?
根據§5.3.6,數組和類型具有相同的對齊方式,所以不應該有任何填充。但在§9.2中它說:「[...]執行對齊要求可能會導致兩個相鄰的成員不能立即分配;因此可能需要管理虛擬功能(10.3)和虛擬基類(10.1)的空間。」 _任何人都可以構造一個失敗的案例嗎? – 2013-04-12 14:53:51
謝謝,這很有用。我已經嘗試過使用gcc進行各種實驗,但還沒有發現失敗。我只玩簡單的結構,我目前的用例不需要涉及虛擬類型。 – GeoffW
我會試圖使用'union'並至少做一些'static_assert'大小的數學。有些'assert'數學來確保'&two.last ==&one.arr [N-1]'。 – Yakk