【发布时间】:2015-01-29 16:14:38
【问题描述】:
我正在测试类对齐并发现奇怪的行为。我使用 VS2012 编译器设置 4 和 8 字节对齐设置对其进行了测试,但在每种情况下输出都是相同的。
class Alignemnt{
public:
Alignemnt():a(){}
int a;
};
class Alignemnt_1{
public:
int a;
char array[2];
};
class Alignemnt_2{
public:
int a;
char array[2];
int x;
};
std::cout << "Sizeof(Alignemnt) :" <<sizeof(Alignemnt) << std::endl;
std::cout << "Sizeof(Alignemnt_1) :" <<sizeof(Alignemnt_1) << std::endl;
std::cout << "Sizeof(Alignemnt_2) :" <<sizeof(Alignemnt_2) << std::endl;
每次输出为:
Sizeof(Alignemnt) : 4
Sizeof(Alignemnt_1) : 8
Sizeof(Alignemnt_2) : 12
我认为,Alignemnt_2 的大小应该是 16 字节。
【问题讨论】:
-
那么,您的问题是什么?在我看来,编译器做得很好?
-
我认为,Alignemnt_2 的大小应该是 16 字节。
-
int 通常是 4 字节对齐的。 char[2] 只是一个 2 字节的对象。你得到一个 12 字节的大小,因为第一个 int 占用 4 个字节,第二个对象占用 2 个字节,第三个需要 4 个字节对齐。
-
@TonyD 大小是对齐的倍数,因此对齐会影响大小。这甚至没有讨论 member 对齐对包含对象的大小的影响。
-
也许他应该尝试编译更多测试!经过一些简单的阅读,我在想,也许 Visual Studio 编译器以一种特殊的方式优化了数据存储?
标签: c++ memory-alignment