c/c++資料對齊問題

nanlour發表於2024-03-15

c/c++ 如何在棧上保證資料對齊:

#include <iostream>

struct __attribute__((aligned(16))) X
{};
int main() {
X x{};
std::cout<<((long long)&x)%16;
}
彙編程式碼X86-64(僅開頭部分):
main:
push rbp
mov rbp, rsp
sub rsp, 16
可以看到並沒有做什麼特別操作,僅僅準備了16byte的棧。但是如果初始棧地址不是16byte對齊的,那不就錯誤了?
檢索發現,X86-64預設棧對齊為16byte,如果對齊要求大於16byte會怎麼樣:
#include <iostream>
struct __attribute__((aligned(32))) X
{};

int main() {
X x{};
std::cout<<((long long)&x)%32;
}
彙編程式碼X86-64(僅開頭部分):
main:
push rbp
mov rbp, rsp
and rsp, -32
sub rsp, 32
解決方法是先將棧對齊,然後再分配空間。


相關文章