2016-06-21 6 views
-1

こんにちは私は、sizeofを行うときにCの標準がメモリアライメントを必要としていることを理解しています。しかし、なぜ整数配列さえ整列させる必要があるのか​​、私はあまり理解していません。私の次の例を参照してください:整数の整列のサイズは?

#include <stdio.h> 

struct flexarray { 
    int a[2]; 
    double f; 
}; 

int main(int argc, char** argv) 
{ 
    printf("sizeof (struct flexarray) = %zu\n", sizeof (struct flexarray)); 
    return 0; 
} 

出力は16 8. = sizeof(double) 4 = sizeof(int)ので、細かいされていることです。

int[3]をaに変更すると、出力は24になります。計算結果が20(= 3 x 4 + 8)になるため、期待したとおりではありません。

私が考えることができる唯一の説明は、コンパイラーがパディング整数を追加するのですが、なぜこのようなことが起こるのか分かりません。sizeof(int[3])は12であり、結局4バイトの倍数です。

gccを使用して32ビットLinuxでコンパイルしています。

Linux 93c9e1096795 3.10.0-327.10.1.el7.x86_64 #1 SMP Tue Feb 16 17:03:50 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux 

誰でも教えてください。

+0

"こんにちは、私は、sizeof'を実行するときにCの標準がメモリアライメントを必要としていることを理解しています - Ehm、いいえ!アラインメントとはどのような関係がありますか?彼らは最初は無関係です。 – Olaf

+0

アライメントはメモリアクセスに関連しています。構造体のサイズに影響を及ぼし、構造体のサイズを異ならせることを除いて、 'sizeof'やCの標準には全く関係ありません。 –

+0

あなたのプラットフォームでは、double型の境界が8バイトの境界に整列する必要があるようです。そのため、あなたの 'int [3]'配列の後ろに4バイトのパディングを挿入する必要があります。十分にはっきりしているようだ。 –

答えて

3

offsetofを使用してクラスのメンバーの位置を確認すると、コンパイラはdoubleの値を8バイトの境界に揃えたいと考えています。

+0

Cはクラスをサポートしていません。そして整列をチェックするには、 'offsetof'ではなく' _Alignof'/'alignof'を使います。 – Olaf

関連する問題