是与扁平结构相同大小的嵌套结构
Are nested structs the same size as flattened structs?
#include <iostream>
#include <string>
struct A { int x; };
struct B { A a; char y; };
struct C { B b; double z; };
struct D { C c; void *alpha; };
struct E { D d; float beta; };
struct F {
int x; char y; double z; void *alpha; float beta;
};
int main()
{
static_assert(sizeof(E) == sizeof(F), "Whoops!");
}
上面的工作和给我相同的尺寸。但我更希望你能保证这永远是真的。将它吗?
不,它们不必相同。两个选项的大小也不需要不同,这取决于情况,但正如Joachim在评论中提到的,填充确实起作用。重点关注更简单的类型,即那些具有标准布局的类型(在本例中是POD,它的限制性稍强一些):
struct A { int a; }; // 4 aligned, size 4
struct B { A a; char ch; }; // 4 aligned, size 8
struct C { B b; char ch2; }; // 4 aligned, size 12
原因是,为了在B
中为int
成员提供正确的对齐,编译器(不是强制的,但大多数编译器的目标是实现自然对齐)在ch
成员之后注入3字节的填充。当C
内部使用B
时,它需要8个字节(包括3个填充),在添加ch2
之后,编译器注入额外的填充,最终浪费了6个字节。
struct D { int a; char ch; char ch2; };
在这种情况下,ch
和ch2
的自然对齐是1,所以两个成员之间没有填充。在结构的末尾会有一些填充(在本例中为2字节),但总填充量会减少。
相关文章:
- 在nlohmann json中,如何将嵌套对象的数组转换为嵌套结构的向量
- 如何使用boost::具有嵌套结构和最小代码更改的序列化
- 用C#中的并集模拟C++嵌套结构
- 如何在 C++11 中查找和更新向量中的一个嵌套结构
- Lambda 捕获、初始值设定项和嵌套结构
- 给定一个C++嵌套的私有结构类型,是否有从文件范围静态函数访问它的策略
- 使用g++静态初始化带有命名标签的嵌套C++结构
- 重载嵌套结构/类的流插入运算符
- C++将结构传递给函数以访问嵌套结构
- C++ 在外部使用嵌套结构实现类函数
- 嵌套结构,从由空行分隔的文件中读取数据
- 在 glsl opengl 中将嵌套结构数组作为统一传递
- 如何创建结构的结构结构,等等嵌套多个结构?
- 嵌套在联合中的结构嵌套在 C 中的结构中
- 受保护的嵌套结构不能用作派生外部类中的返回类型?
- C++中的嵌套结构
- 嵌套的模板结构构造函数实现
- 使用嵌套结构初始化并集
- C++ 中的嵌套结构函数
- C++中匿名类型的嵌套结构