0

構造体/クラスの一般的な状況では、メンバー間にアラインメント パディングが存在する場合があります。しかし、この特殊なケースを想定しても安全かどうか疑問に思っています。

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} {}

しかし、term が本当に配列の最後の要素であるかのように結果を同じにしたいのです。

これは安全ですか?そうでない場合、MyStruct の 2 番目の形式を使用して同じことを達成する方法はありますか?

4

1 に答える 1

0

data[N] と term 変数の間にギャップがないと仮定するのは絶対に安全ではありません。たとえば、Microsoft コンパイラが変数を n バイト境界 (n は 1、2、4、8、または 16) に揃える方法を明示的に制御できます。http://msdn.microsoft.com/en-us/library/を参照してください。 xh3e3fd0(v=vs.80).aspx .

于 2013-04-12T12:31:33.393 に答える