私は構造体を扱っており、それらについていくつか質問があります。理解しているように、構造変数は順次メモリに配置されます。ブロック(ワード)の長さは、マシンアーキテクチャ(32ビット - 4バイト、64ビット - 8バイト)に依存します。C:データ構造の整列
32 bit - 20 bytes
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 |
------------------------------------------------------------------------------------------
c1| PB| s | s | c1| PB| PB| PB| d | d | d | d | d | d | d | d | i | i | i | i |
64 bit - 24 bytes | 20 | 21 | 22 | 23 |
previous sequence + ---------------------
| PB | PB | PB | PB |
しかし、我々はマシン語にこのデータフィットを作るために、それを並べ替えることができます:それはなりますメモリで
struct ST1 {
char c1;
short s;
char c2;
double d;
int i;
};
:
は、我々は2つのデータ構造を持っているとしましょう。このように:
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
----------------------------------------------------------------------
d | d | d | d | d | d | d | d | i | i | i | i | s | s | ch1| ch2|
I質問のいくつかあり:
-
32及び64の両方についてこの場合
struct ST2 {
double d;
int i;
short s;
char c1;
char c2;
};
それは同じ方法(16バイト)で表されるビット
struct
の主なルールは、最初に大きなサイズの変数を定義することですか?char str[] = "Hello";
のように?struct ST3 { char c1; char c2; char c3;} st3;
size = 3
を持っていますが、他のタイプのメンバーを追加すると、それが整列することがわかります。しかし、なぜそれはそれの前に整列していないのですか?
待ち時間は何ですか? 'packed'を使うとパディングが取り除かれ、メンバを正しく位置合わせしないようにすることができます。これはx86でも意味があります(例えば、doubleにアクセスすることは正しくアライメントされていればアトミックになります) – Christoph
Cristophが言うように、完全な誤情報です。 – Casey