如何在gcc中明确禁用对定义变量的对齐?
拿这个代码:
typedef struct{
unsigned long long offset;
unsigned long long size;
unsigned long type;
unsigned long acpi;
}memstruct;
memstruct *memstrx;
这将定义一个大小为24字节的结构 我试过了:
memstrx=(void*)(0x502);
因此
&memstrx[0]
的值应为0x502
&memstrx[1]
,0x51A
&memstrx[2]
,0x532
......等等。
但事情似乎并不正确。
相反,
&memstrx[1]
,显示地址0x522
&memstrx[2]
,0x542
&memstrx[3]
,0x552
......依此类推。
我怀疑GCC已经隐式地将结构重新调整为32字节(从24字节),强制a(每个条目的64位对齐)。我真的不希望这种行为只适用于这种结构。我该如何告诉GCC不要对齐那个结构?
答案 0 :(得分:6)
不,不能做到。
您显示的结构的最小尺寸为8 * 4 = 32字节。
64位体系结构(Linux)sizeof(unsigned long)= 8
修改:如果您要使用
- unsigned
代替unsigned long
或
uint32_t
和uint64_t
代替unsigned long
和unsigned long long
你会得到预期的对齐。
答案 1 :(得分:2)
#pragma pack(x)可以更改GCC和MSVC上的结构对齐限制。
GCC使用LP64模型进行64位构建 - 这意味着长和指针是64位。您需要更改为32位字段的unsigned int,或者使用uint32_t和uint64_t来获得稳定的字段大小。
#pragma pack(1)
typedef struct{
unsigned long long offset;
unsigned long long size;
unsigned int type;
unsigned int acpi;
}memstruct;
#pragma pack()
答案 2 :(得分:1)
这是使用gcc控制对齐的一个选项:
http://gcc.gnu.org/onlinedocs/gcc/Structure_002dPacking-Pragmas.html