私は構造を扱っており、それらについていくつか質問があります。私が理解しているように、構造変数はメモリに順番に配置されます。ブロック (ワード) の長さは、マシンのアーキテクチャ (32 ビット - 4 バイト、64 ビット - 8 バイト) によって異なります。
2 つのデータ構造があるとします。
struct ST1 {
char c1;
short s;
char c2;
double d;
int i;
};
メモリ内では次のようになります。
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 ST2 {
double d;
int i;
short s;
char c1;
char c2;
};
この場合、32 ビットと 64 ビットの両方で同じ方法 (16 バイト) で表されます。
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|
いくつか質問があります。
- 勝手な推測ですが
struct
、最初に大きなサイズの変数を定義するのが主なルールですか? - 私が理解しているように、スタンドアロンの変数では機能しません。のように
char str[] = "Hello";
? - パディングバイト、それは何のコードですか? それはASCIIテーブルのどこかにありますか?見つかりませんでした。
- すべてのメンバーが異なるアドレスでメモリに表されている2つの構造体で、メモリに順番に配置することはできませんか?
- そのような構造:
struct ST3 { char c1; char c2; char c3;} st3;
Hassize = 3
、それに他の型のメンバーを追加すると、整列されることがわかりました。しかし、なぜそれはその前に整列されていないのですか?