【发布时间】:2016-02-01 01:17:48
【问题描述】:
假设是 64 位机器:
如果我从 A 类开始:
struct A
{
int* a1; //8
int* a2; //8
uint16_t a3; //2
uint16_t a4; //2
uint32_t a5; //4
uint32_t a6; //4
uint32_t a7; //4
};
现在所有单个成员都正确对齐了,A 的大小为 32 字节,a5 到a1 的偏移量为 20 字节
现在,如果我尝试将其重构如下:
struct A_part1
{
int* a1; //8
int* a2; //8
uint16_t a3; //2
uint16_t a4; //2
};
struct A_new
{
A_part1 a1;
uint32_t a5; //4
uint32_t a6; //4
uint32_t a7; //4
};
现在A_new 的大小为 40 字节,因为 A_part1 被填充到 24 个字节,A_new 随后从 36 填充到 40 个字节。
大概编译器正试图确保连续的A_part1 将对齐。
如果我知道我只会在A 中使用A_part1,这是我必须在a_part1 上使用pragma 包的唯一选择,以确保A_new 具有相同的特征和原来的A一样吗?
【问题讨论】:
-
请注意,a) pragma 通常不被认为是可移植的。 2) 不同的编译器可能有相似的编译指示,但它们的名称不一定相同。 3) 编译器选项(即优化级别)与以前的设置相比可能会更改布局,您可能需要测试编译指示是否仍然执行您想要的操作。另一方面,我在 C++ 中使用 pragma 的经验通常是它们有效。