c - Gcc 填充结构列表

标签 c gcc padding

在 gcc 编译器填充后,如何获得包含我所有结构的列表? 假设我的代码包含以下结构:

typedef struct{
   char a;
   int b;
} struct_i;

希望的输出是(对于我代码中的所有结构):

typedef struct{
char a;
char padding[3];
int b;
} struct_i;

目的是分析,可能考虑结构成员重排,减少用于填充的内存。

最佳答案

只有部分答案:如果您只对信息感兴趣(无法反馈结构),您可以使用带有以下选项的 clang:

clang -c my prog.c -Xclang -fdump-record-layouts

例如下面的代码

#include <stdio.h>
struct foo{
 char c;
 int  i;
};

int main()
{
  struct foo bar = {'a',42};
  printf("%d\n%d\n",(int)bar.c,bar.i);

  return 0;
}

产生

 > clang -c foo.c -Xclang -fdump-record-layouts

 *** Dumping AST Record Layout

          0 | struct foo
          0 |   char c
          4 |   int i
            | [sizeof=8, align=4]

 *** Dumping IRgen Record Layout Record: RecordDecl 0x7f80fe0a47e0 <foo.c:2:1, line:5:1> line:2:8 struct foo definition |-FieldDecl
 0x7f80fe0a48a0 <line:3:2, col:7> col:7 referenced c 'char' `-FieldDecl
 0x7f80fe0a4900 <line:4:2, col:7> col:7 referenced i 'int'

 Layout: <CGRecordLayout   
    LLVMType:%struct.foo = type { i8, i32 }  
    IsZeroInitializable:1   
    BitFields:[ 
 ]>

关于c - Gcc 填充结构列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48868130/

相关文章:

svg - SVG 元素的盒模型属性(边距、填充)。他们得到支持吗?

c - 位域结构填充

c - 检测到堆损坏 - 使用字符串实现合并排序

c++ - 来自不兼容类型 c 的赋值

c - 如何在c中编写迷你shell时解析输入命令行

c++ - Clang 预处理器从 C++ 文件中去除注释

c - 用于 C 的 gvim 和 gdb?

c++ - 我编译了最新版本的 GCC。如何将 CLion 指向它的位置?

gcc - "gcc -x c"和 "gcc -x c++"汇编输出的区别

html - 错误消息的 CSS 样式