如何解决何时应在LLVM IR中为结构添加填充?而且什么时候不应该呢?
在不同情况下,当在结构中添加填充时,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 举报,一经查实,本站将立刻删除。