【发布时间】:2020-06-27 14:17:04
【问题描述】:
我已阅读文章和 SO 答案,了解如果我们按照独立字段大小的递减顺序布局结构,我们如何切断编译器添加的填充。
例如:而不是像这样布置(L1)结构
typedef struct dummy {
char c1;
short s1;
int i1;
unsigned int ui1;
double d1;
} dummy_t;
像这样创建布局(L2)
typedef struct dummy {
double d1;
unsigned int ui1;
int i1;
short s1;
char c1;
} dummy_t;
我的问题是,与 L1 或任何其他布局相比,布局 L2 是否存在缺点?或者我可以将它纳入我的设计规则以始终使用 L2 吗?也是自然对齐规则
natural alignment = sizeof(T)
对于原始类型总是正确的?
【问题讨论】:
-
C 和 C++ 是不同的语言,C 中的 struct 与 C++ 中的不同。在 C++ 中,结构被推广到类。选择您的语言。
-
我是从 C PoV 说的。但是我相信对齐和填充仍然适用于成员变量的 C++ 结构和类?
-
@RohitMat - 是的,对齐和填充适用于 C++ 结构和类类型。但是,访问控制开始发挥作用,并且会影响成员的顺序,从而影响填充。因此,C++ 中的良好实践(无论如何衡量)可能与 C 中的良好实践完全不同。如果您是从 C PoV 中谈论的,因此我建议删除 C++ 标记。
-
@Peter,我会删除标签。谢谢
-
@P__J__ C 中的有效
struct在编译为 C++ 时通常具有相同的内存布局。
标签: c memory-alignment