2017-01-14 2 views
1

変数vのサイズは12バイトですが、サイズは6ビットなので、なぜ4バイトにならないのですか?次のプログラムの出力は12バイトになるのに対して、合計サイズは6ビットしかないのはなぜですか?

#include <iostream> 
using namespace std; 

struct abc { 
    int c : 4; 
    char x : 1; 
    int y : 1; 
} v; 

int main() 
{ 
    cout << sizeof v; // it prints 12 . why? 
} 
+0

メモリ内のすべてが正しく整列されるように、構造体にはパディングされたメモリがあります。あなたのコンパイラが4バイト境界でストライドを設定しているようです。それぞれ4バイトを占めるintが2つあります(int32ですが、これは明示的に定義されていません。コンパイラはそれを解決しています)。最後にcharは1バイトを取り、9バイトになります。メモリは奇数では解決できません。各アドレスは偶数のスペースで開始する必要があります。したがって、3バイトで埋め込まれています。したがって、4 + 4 + 4 = 12 – Alex

+0

です。http://en.cppreference.com/w/ cpp/language/bit_field –

答えて

5

問題は、ビットフィールドのタイプを混在させることです。そのになる可能性があります。これにより、データが揃っていることを確認するためにパディングが追加されます。 intを全面的に使用すると、メンバー間でパディングは必要ありません。これはあなたが使用しているたコンパイラに多くを依存し

注意。私のホームLinuxシステムでGCC 6.2.0で試してみると、タイプにかかわらず、サイズは4バイトになります。

+0

また、Apple LLVMバージョン8.0.0を使用して 'OSX 'に' 4'を表示します。 – axiac

+0

はい、ISO Cの標準から1409実装は、ビットフィールドを保持するのに十分な大きさのアドレス指定可能な記憶ユニット。だから、パディングがあるかもしれません。 – void

関連する問題