C++ 什么时候应该在LLVM IR中向结构添加填充?什么时候';T

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=类型{

在不同的情况下,当向结构添加填充时,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=类型{i8,double}

我有几个问题:

  • CT1有填充,而CT2没有。CT1与CT2的不同之处在于其初始值为
    c1
    。为什么?
  • CT3没有填充,这与CT1不同之处在于减少了名为
    c2
    的属性。为什么?
  • CT2的IR代码没有明确添加填充,但在日志中(使用-Wpadded)它似乎已经添加了填充,这是真的吗?这是否意味着我们不能手动添加填充物
  • 警告:用7个字节填充结构“CT3”以对齐“d1”[-Wpadded]
    双d1;
    
  • 如何通过LLVM的IRBuilder向结构添加填充
  • 我需要手动生成IR代码,所以我需要知道何时应该向结构添加填充


    非常感谢您的回复。

    CT1有一个自定义构造函数,而CT2没有。这使得CT1与CT2不同,不是吊舱。看起来这些处理方式不同:3:我认为你只是手动添加假的i8字段?Clang有C++规则和目标机器规则。前者不是我喜欢的。对于后者,LLVM的目标布局声明决定何时添加推送。@非常感谢您的回复。CT3的i8字段确实是错误添加的,已经删除了。@arnt感谢您的回复。我真的需要清楚地找出规则。C++不为简单规则所知。使编译器作者的生活变得简单是一个明确的非目标。很抱歉但至少你有了叮当声的来源并且可以阅读它。