问题描述
在不同情况下,当在结构中添加填充时,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,i8 }
%struct.CT3 = type { i8,double }
我有几个问题:
- CT1有填充,而CT2没有。 CT1与CT2的不同之处仅在于其初始值为
c1
。为什么? - CT3没有填充,仅与CT1不同,只是减少了名为
c2
的属性。为什么? - CT2的IR代码未明确添加填充,但是在日志中(使用
-Wpadded
)似乎已经添加了填充,这是真的吗?这是否意味着我们不能手动添加填充?
warning: padding struct 'CT3' with 7 bytes to align 'd1' [-Wpadded]
double d1;
- 如何通过LLVM的IRBuilder向结构中添加填充?
我需要手动生成IR代码,因此我需要知道何时应该在结构中添加填充。
非常感谢您的答复。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)