C:数据结构对齐

Via*_*iuk 7 c c++ alignment data-structures

我正在使用结构,并对它们有几个问题.据我所知,结构变量将按顺序放在内存中.块长度(字)取决于机器架构(32位--4字节,64位 - 8字节).

假设我们有2个数据结构:

struct ST1 {
    char c1;
    short s;
    char c2;
    double d;
    int i;
};
Run Code Online (Sandbox Code Playgroud)

在内存中它将是:

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 |
Run Code Online (Sandbox Code Playgroud)

但我们可以重新排列它,使这些数据适合机器字.像这样:

struct ST2 {
    double d;
    int i;
    short s;
    char c1;
    char c2;
};
Run Code Online (Sandbox Code Playgroud)

在这种情况下,对于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|
Run Code Online (Sandbox Code Playgroud)

我有一些问题:

  • 这就像疯狂猜测,但主要规则struct是在开始时定义更大尺寸的变量?
  • 据我所知,它不适用于独立变量.喜欢char str[] = "Hello";
  • 填充字节,它有什么代码?它在ASCII表的某个地方吗?对不起,找不到了.
  • 2个结构,所有成员在内存中用不同的地址表示,它们可以不按顺序放在内存中?
  • 这样的结构:struct ST3 { char c1; char c2; char c3;} st3;size = 3,我明白,如果我们将与其他类型的添加成员到它,它会对齐.但为什么它之前没有对齐呢?

Sha*_*har -1

请小心,您不确定变量是否对齐(但通常是对齐的)。如果您使用 GCC,您可以使用Packed属性来确保数据对齐。

例子 :

struct foo {
    char c;
    int x;
} __attribute__((packed));
Run Code Online (Sandbox Code Playgroud)

据我了解,它不适用于独立变量。就像 char str[] = "Hello"; 一样?

该表将在您的记忆中对齐。

  • 等等,什么?使用“packed”将消除填充,可能会迫使成员“不”正确对齐,这甚至在 x86 上也有影响(例如,如果正确对齐,则访问“double”只是原子的) (2认同)