web-dev-qa-db-ja.com

PODタイプのパディングバイトはコピーされますか?

次のようなPODタイプがあるとします。

_struct A {
    char a;
    int b;
};
_

私のシステムでは、sizeof(A) == 8sizeof(char) == 1にもかかわらず、sizeof(b) == 4です。これは、データ構造に3つの未使用バイトがあることを意味します。

今やると仮定します

_A x = ...;
A y =x;
_

質問:

xyの8バイトすべてが、3つの未使用のバイトであっても同一であることが保証されていますか?

同様に、いくつかのAオブジェクトの基礎となるバイトを、それらの意味または構造を理解しない別のプログラムに転送し、それらを8バイトの配列として扱う場合、他のプログラムは2つのAs平等ですか?

注: gcc 7を使用した実験 では、これらのバイトがコピーされるようです。これが保証されているかどうか知りたいです。

47
Szabolcs

非ユニオンクラスXの暗黙的に定義されたコピー/移動コンストラクターは、そのベースとメンバーのメンバーごとのコピー/移動を実行します。

N4141の12.8/15 [class.copy]

したがって、パディングバイトのビットパターンは異なることができます。

43
Baum mit Augen

正式ではありませんが、 _std::memcmp_cppreferenceのエントリは、パディングバイトが異なる可能性があることを示唆しています。

タイプ_struct{char c; int n;}_の2つのオブジェクト間のmemcmp()は、cnの値が同じ場合に値が異なる可能性があるパディングバイトを比較します

7
Tristan Brindle

PODタイプ(したがって、共用体を含む)について尋ねたとすると、[class.copy]によると言及する価値があります。

ユニオンXの暗黙的に定義されたコピー/移動コンストラクターは、Xのオブジェクト表現(6.9)をコピーします

簡単にコピー可能な型には、パディングビットも含める必要があります。したがって、Aを

union A{ struct {
    char a;
    int b;
}; };

(実際には、上記は非標準の匿名構造体を使用していますが、ポイントを得ます...)

6

2番目の質問に答える:

同様に、一部のAオブジェクトの基礎となるバイトを、その意味や構造を理解しない別のプログラムに転送し、それらを8バイトの配列として扱う場合、他のプログラムは2つの安全性を安全に比較できますか?

あなたのタイプのオブジェクトにはパディングバイトが含まれている可能性があるため、別のプログラムでは通常、そのような2つのオブジェクトの等価性を比較できません。

知っている ビット 意味的にオブジェクトを構成するバイトのうち、 値表現。ただし、このシナリオでは、ターゲットプログラムは オブジェクト表現、つまり バイト パディングバイトを含む、メモリ内のそのようなオブジェクトを表します。 memcmpのような関数は、値表現がそのオブジェクト表現と意味のある方法で同一であるようなオブジェクトのみを比較できます。オブジェクトをパディングしても値ごとにオブジェクトを比較する場合、オブジェクト表現のどのビットが2つのオブジェクトの値表現が等しいかがわからないため、正しい結果が得られない場合があります。

http://en.cppreference.com/w/cpp/language/object を参照してください

4
Jodocus