6
struct Line
{
    Bounds          bounds_;
    Vector          origin_;
    uint32_t        begin_; 
    uint32_t        end_;   
    dist            ascent_;
    dist            descent_;
};

これは次のように使用されます。

Line line = {};
while (!parser.done()) {
    line = Line(); // zero-initialize
    ...
}

BoundsおよびVectorは非 POD クラスであり、distは の typedef ですint64_t

lineただし、最適化された VC++11 の 32 ビット リリース ビルドでは、while ループ内に少なくとも初期化されていない部分が残っているようです。なんで?によると、型名の後の括弧は新しいものと違いがありますか? 、それはゼロで初期化されているはずですよね?

構造体メンバーの値をファイルに記録します。

  • after Line line = {};: 非 POD タイプはデフォルトで初期化され、その他は 0 です。
  • after line = Line();: POD タイプはまだデフォルトで初期化されており、その他にはランダムな値が含まれています。
4

1 に答える 1

6

コンパイラのバグを見つけたかもしれませんが、C++98 では POD 構造体を初期化するための要件が​​明確に記述されていなかったことを覚えているようです。

C++03 によると、式のLine()結果は値で初期化されたLine オブジェクトになる必要があります。これは、この場合、すべてのメンバーがゼロで初期化される必要があることを意味します(すべてのメンバーがスカラーであるため)。

メンバー間の最終的なパディングは、特定の値に設定する必要がないことに注意してください。そのため、Line オブジェクトをメモリの塊として見ると、誤検知が発生する可能性があります。

回避策は、Lineすべてのメンバーを明示的に初期化するデフォルトのコンストラクターを提供することです。

于 2013-01-09T11:00:34.510 に答える