我在这里阅读有关C语言中的结构填充的信息:http : //www.catb.org/esr/structure-packing/。
我不明白为什么在编译时为堆栈上分配的变量/结构确定的填充在所有情况下在语义上都是有效的。让我提供一个例子。假设我们要编译以下玩具代码:
int main() {
int a;
a = 1;
}
Run Code Online (Sandbox Code Playgroud)
在X86-64上gcc -S -O0 a.c生成此程序集(删除了不必要的符号):
main:
pushq %rbp
movq %rsp, %rbp
movl $1, -4(%rbp)
movl $0, %eax
popq %rbp
ret
Run Code Online (Sandbox Code Playgroud)
在这种情况下,为什么我们知道4的值%rbp并因此%rbp-4是4对齐的,以适合于int的存储/加载?
让我们尝试使用结构相同的示例。
main:
pushq %rbp
movq %rsp, %rbp
movl $1, -4(%rbp)
movl $0, %eax
popq %rbp
ret
Run Code Online (Sandbox Code Playgroud)
从阅读中我推断出结构的填充版本看起来像这样:
struct st{
char a;
int b;
}
Run Code Online (Sandbox Code Playgroud)
所以,第二个玩具的例子
struct st{
char a; // 1 byte
char …Run Code Online (Sandbox Code Playgroud)