C++ 什么时候应该在LLVM IR中向结构添加填充?什么时候';T
在不同的情况下,当向结构添加填充时,Clang有不同的行为,规则是什么C++ 什么时候应该在LLVM IR中向结构添加填充?什么时候';T,c++,clang,llvm,llvm-ir,C++,Clang,Llvm,Llvm Ir,在不同的情况下,当向结构添加填充时,Clang有不同的行为,规则是什么 以下代码: struct CT1{ 字符c1='c'; 双d1; 字符c2; }; 结构CT2{ 字符c1; 双d1; 字符c2; }; 结构CT3{ 字符c1='c'; 双d1; }; int main(){ CT1 CT1; CT2 CT2; CT3 CT3; 返回0; } Clang将生成IR代码: %struct.CT1=类型 %struct.CT2=类型{i8,double,i8} %struct.CT3=类型{
struct CT1{
字符c1='c';
双d1;
字符c2;
};
结构CT2{
字符c1;
双d1;
字符c2;
};
结构CT3{
字符c1='c';
双d1;
};
int main(){
CT1 CT1;
CT2 CT2;
CT3 CT3;
返回0;
}
Clang将生成IR代码:
%struct.CT1=类型
%struct.CT2=类型{i8,double,i8}
%struct.CT3=类型{i8,double}
我有几个问题:
c1
。为什么?c2
的属性。为什么?-Wpadded
)它似乎已经添加了填充,这是真的吗?这是否意味着我们不能手动添加填充物警告:用7个字节填充结构“CT3”以对齐“d1”[-Wpadded]
双d1;
非常感谢您的回复。CT1有一个自定义构造函数,而CT2没有。这使得CT1与CT2不同,不是吊舱。看起来这些处理方式不同:3:我认为你只是手动添加假的i8字段?Clang有C++规则和目标机器规则。前者不是我喜欢的。对于后者,LLVM的目标布局声明决定何时添加推送。@非常感谢您的回复。CT3的i8字段确实是错误添加的,已经删除了。@arnt感谢您的回复。我真的需要清楚地找出规则。C++不为简单规则所知。使编译器作者的生活变得简单是一个明确的非目标。很抱歉但至少你有了叮当声的来源并且可以阅读它。