されている以下の2つの異なる解釈:PODがクラス内にラップされている場合は、同じ効果がありますか?
char c; // 1
struct MyChar { char c; }; // 2
私はnew MyChar[100]
を行う場合には、それはすべてのプラットフォームで100のバイトを割り当てますか? virtual
コンストラクタ/デストラクタおよび/またはoperator
を追加すると、MyChar
のサイズに影響しますか?
されている以下の2つの異なる解釈:PODがクラス内にラップされている場合は、同じ効果がありますか?
char c; // 1
struct MyChar { char c; }; // 2
私はnew MyChar[100]
を行う場合には、それはすべてのプラットフォームで100のバイトを割り当てますか? virtual
コンストラクタ/デストラクタおよび/またはoperator
を追加すると、MyChar
のサイズに影響しますか?
MyChar
は、c
の後に名前のないパディングバイトを持つ可能性があります。したがって、いいえ、sizeof(MyChar)
が1
であることを保証するものではありません。
MSVCでは、使用することができます:
#pragma pack(1)
struct MyChar
{
char c;
};
// Restore
#pragma pack()
本当ですか?私は、あなたが '#pragma pack(push)/ #pragma pack(1)'を '#pragma pack(pop)'の後に使用する必要があることはほとんど確信しています。 '#pragma pack()'はパックの値をデフォルトに戻します。それはあなたの '#pragma pack(1)'の前にあったものではないかもしれません。 –
'push'と' pop'は、プラグマパックのスタックアップに使用されます。彼らは必要ではありません。例えば、あなたのパッキングは2、次に4、そして1、そこに 'push/pop'を使うかもしれません。私は 'pack(1)'を使い、 'pack()'を使って元に戻り、必要に応じて動作します。 – Ajay
そのパディングを回避するために、任意の標準言語サポートはありますか? – iammilind
Nope;あなたの唯一の選択肢は、プラグマ/属性をパックするコンパイラ固有の構造体を実際に使用することです。 –
多くの一般的なコンパイラは、 '#pragma pack(1)'を使用しています... GCC、IBM、MS ...後でデフォルトのパッキングを復元するにはちょっと変わったかもしれません。 –