结构体的大小即使有填充也不清楚
Sizeof struct is not clear even with padding
在下面的结构体中,我觉得大小应该是20,但结果是24。
class X {
unsigned int a;
unsigned int b;
double c;
unsigned int d;
};
为什么编译器不能从16-20字节排列d
?
这是为了使c
在X
的数组中保持在8字节边界上对齐。
X x[2];
X[0]:
0-3 unsigned int a
4-7 unsigned int b
8-15 double c
16-19 unsigned int d
20-23 [PAD]
X[1]:
24-27 unsigned int a
28-31 unsigned int b
32-39 double c
40-43 unsigned int d
44-47 [PAD]
因此,您可以看到在数组元素之间需要4字节的填充。这是通过在对象的末尾添加4字节来捕获的。如果第二个数组元素从位置20
开始,那么您会发现x[1].c
不是8字节对齐的。
所以,最后,d
确实从第16字节开始,但d
的结束不是对象的结束。
在这样的POD结构中,struct
的地址是它的第一个元素的地址。size是类型为X[]
的数组中连续元素之间在内存中的距离。为了使double
在假设数组的第二个元素中对齐,第一个int
和整个struct
必须按照与double
相同的严格度对齐。
您在哪个平台上运行?在我的ubuntu机器上,它只给我输出20 !!sizeof unsigned int是4,double是8,这就是为什么在我的机器上输出的是20 !!这因硬件而异!!
相关文章:
- 关于隐式声明的复制构造函数的引用在逻辑上不清楚
- C++复制 c'tor 现在确实会采取行动。 不清楚为什么
- 矢量编程:不清楚矢量的初始化
- 调用虚函数的逻辑不清楚(或者是方法隐藏?
- cudaMemcpy 在从设备读取到主机时返回 cudaErrorInvalidArgument,不清楚原因
- 实现附加对象:不清楚的文档示例
- 智能指针移动语义我不清楚
- 在 c++ 中移动 2d 数组的构造函数(语法逻辑不清楚):
- 为什么这个错误如此不清楚
- 在特定情况下,指针删除和铸造之间的关系不清楚
- 切换语句在 C++ 中的输出不清楚
- 不清楚的副本分配操作员示例
- 101 Qt 样式表边距填充黑客指南在C++。设置填充不起作用
- 我在c++应用程序上搞不清楚
- Visual Studio 2012 中的错误日志不清楚
- C++引用-有些事情我不清楚
- 解密不清楚的语法
- 使用Boost Coroutine(1.55)的不清楚分割错误
- 不清楚按位 AND 赋值的使用
- 结构体的大小即使有填充也不清楚