何时应在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 }

我有几个问题:

  1. CT1有填充,而CT2没有。 CT1与CT2的不同之处仅在于其初始值为c1。为什么?
  2. CT3没有填充,仅与CT1不同,只是减少了名为c2的属性。为什么?
  3. CT2的IR代码未明确添加填充,但是在日志中(使用-Wpadded)似乎已经添加了填充,这是真的吗?这是否意味着我们不能手动添加填充?
warning: padding struct 'CT3' with 7 bytes to align 'd1' [-Wpadded]
  double d1;
  1. 如何通过LLVM的IRBuilder向结构中添加填充?

我需要手动生成IR代码,因此我需要知道何时应该在结构中添加填充。

非常感谢您的答复。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)