当向结构添加填充时,Clang 在不同情况下有不同的行为,规则是什么?
对于下面的 C++ 代码:
struct CT1 {
char c1 = 'c';
double d1;
char c2;
};
struct CT2 {
char c1;
double d1;
char c2;
};
struct CT3 {
char c1 = 'c';
double d1;
};
int main() {
CT1 ct1;
CT2 ct2;
CT3 ct3;
return 0;
}
Clang 将生成 IR 代码:
%struct.CT1 = type <{ i8, [7 x i8], double, i8, [7 x i8] }>
%struct.CT2 = type { i8, double, i8 }
%struct.CT3 = type { i8, double }
我有几个问题:
- CT1 有填充,而 CT2 没有。 CT1 与 CT2 的唯一不同之处在于其初始值为
c1
. Why?
- CT3没有padding,与CT1的区别只是减少了一个属性
c2
. Why?
- CT2 的 IR 代码没有显式添加填充,而是在日志中添加填充(使用
-Wpadded
)似乎已经添加了填充,这是真的吗?这是否意味着我们不能手动添加填充?
warning: padding struct 'CT3' with 7 bytes to align 'd1' [-Wpadded]
double d1;
- 如何通过LLVM的IRBuilder向结构体添加填充?
我需要手动生成 IR 代码,所以我需要知道何时应该向结构添加填充。
真的感谢您的任何回复。
None
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)