小编dav*_*23r的帖子

为什么C中的填充对于在堆栈上分配的变量/结构有效?

我在这里阅读有关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)

c linux assembly x86-64 abi

3
推荐指数
1
解决办法
170
查看次数

标签 统计

abi ×1

assembly ×1

c ×1

linux ×1

x86-64 ×1