代码之家  ›  专栏  ›  技术社区  ›  wingerse

结构与参数的数据对齐方式不同?

  •  0
  • wingerse  · 技术社区  · 6 年前

    给出以下代码:

    typedef struct tagRECT {
      int left;
      int top;
      int right;
      int bottom;
    } RECT;
    
    extern int Func(RECT *a, int b, char *c, int d, char e, long f, int g, int h, int i, int j);
    
    int main() {
    
    }
    
    void gui() {
        RECT x = {4, 5, 6, 7};
        Func(&x, 1, 0, 3, 4, 5, 6, 7, 8, 9);
    }
    

    这是程序集生成的gcc x86_64,大概在Linux上(我使用 compiler explorer )

    main:
      mov eax, 0
      ret
    gui:
      push rbp
      mov rbp, rsp
      sub rsp, 16
      ; RECT x assignment
      mov DWORD PTR [rbp-16], 4
      mov DWORD PTR [rbp-12], 5
      mov DWORD PTR [rbp-8], 6
      mov DWORD PTR [rbp-4], 7
    
      ; parameters
      lea rax, [rbp-16]
      push 9
      push 8
      push 7
      push 6
      mov r9d, 5
      mov r8d, 4
      mov ecx, 3
      mov edx, 0
      mov esi, 1
      mov rdi, rax
      call Func
      add rsp, 32
      nop
      leave
      ret
    

    可以看出 int 在结构中,按4个字节对齐。但是函数的最后4个参数 int push D到堆栈,这意味着它们被8个字节对齐。为什么不一致?

    1 回复  |  直到 6 年前