2017-09-21 5 views
2

私は大規模なC++プロジェクトを使用して製造プロセスを自動化する会社で働いています.C++ソースコードのリビジョン履歴を見ると、次のような特有の動作に気付きました。C++オブジェクトを同じサイズに保つスペアデータ?

ソフトウェアのさまざまなリビジョンでのこの動作の簡単な例を以下に示します。ソフトウェアの

リビジョン1:ソフトウェアの

struct Foo 
{ 
    int x; 
    int reserve[20]; // unused 
}; 

リビジョン2:ソフトウェアの

struct Foo 
{ 
    int x; 
    int y[2]; 
    int reserve[18]; // unused 
}; 

リビジョン3:

struct Foo 
{ 
    int x; 
    int y[2]; 
    int z[5]; 
    int reserve[13]; // unused 
}; 

未使用reserve配列がわずかであることは明らかです作成された構造体のインスタンスが常に実行中のソフトウェアのリビジョンに関係なく、同じ量のメモリを使用してください。

私の質問は次のとおりです。これは大規模なC++プロジェクトでこれを行うための一般的なプラクティスですか?そして、このプラクティスを使用することが必要であるか有利であるという一般的な(一般的な意味、非アプリケーション固有の)理由はありますか?

+0

これは絶対にひどいデザインです。それは[バイナリ互換性](https://en.wikipedia.org/wiki/Binary-code_compatibility)を維持することに本当に悪い試みのように思えますか? – CoryKramer

+0

コンパイラの中には、[padding](https://en.wikipedia.org/wiki/Data_structure_alignment)を行うことができるため、構造体が保持されないものがあります。 –

答えて

7

はい、一般的な方法です。私はこれが良いか悪い練習かどうかは、それが依存していると言うことができません。

  • 構造が特定の種類のパケットを表す場合、または特定の種類のデータの フィールドを表す場合は、フィールドが予約されていることがよくあります。 仕様の新しいバージョンが開発されたときに、意味のあるもののために予約されたフィールド が使用されることがあります。私は PCIe仕様に準拠していましたが、これは数回起こりました。
  • ネットワークに新しいデータを追加する場合は、ネットワーク パケットですが、古いバージョンのクライアントは、古いバージョンのパケットと同じように パケットを読み取ることができます。 時には解決策。もちろん

あなたはそれをやったときに、あなたがに期待したことがなかった場所で、多くの場合、いつか将来、予約フィールドが不足する可能性があるため、注意する必要があります。

1

定義した構造体がネットワーク経由で送信され、ネットワークプロトコルネゴシエーションを実装したくない場合、新しい製品バージョンではより多くのフィールドを使用してstructを使用することができ、古いバージョンでも構造体サイズは変わらないので)。それは気づいていない部分を無視します(reserveの一部として扱います)。

関連する問題