2017-05-31 15 views
0

私は、構造体パッキングがC++プログラミング(少なくとも低メモリシステムでは共通)であることを知っています。しかし、クラスはどうですか? 私はそれを正しく出力「5月8日」 C++クラスパッキング/メンバーアライメント

#include <iostream> 

#pragma pack(push, 1) 
class Test_Packed { 
    uint8_t t; 
    uint32_t test; 
}; 
#pragma pack(pop) 

class Test_Unpacked { 
    uint8_t t; 
    uint32_t test; 
}; 

int main() { 
    std::cout<<sizeof(Test_Packed) << "/" << sizeof(Test_Unpacked)<<std::endl; 
    return 0; 
} 

を試してみましたので、それが動作します知っています。

これはすべてのコンパイラに当てはまると仮定できますか、またはこの実装が定義されていますか?

私は、仮想メンバーの追加(したがってvtableの必要性)が追加データを前面に追加することを知っています。これが失敗する他の理由は何か?

これは一部のプラットフォームでパフォーマンスが低下することを除いて問題を引き起こす可能性がありますか?

+2

実装定義です。 –

答えて

1

#pragma状態のドキュメント:

実装定義された行動は#pragmaディレクティブで制御されています。

ので#pragma pack(push, 1)#pragma pack(pop) の効果は、もしあれば、完全ある "定義された実装です。"