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";
?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"; 一样?
该表将在您的记忆中对齐。
归档时间: |
|
查看次数: |
7585 次 |
最近记录: |