簡體   English   中英

為什么結構填充在 64 位和 32 位系統中相同?

[英]Why the Struct padding is same in 64 bit and 32 bit systems?

在 inte.net 上花了很多時間尋找答案后,我什么也沒得到。

我的問題是:我有一個 64 位系統,當我運行這段代碼時:

#include<iostream>
using std::cout;
class A
{
    char a ; //1
    char b ; //1
    int c;   //4
    int d;   //4
};

int main()
{
    A a1;
    cout<<sizeof(a1);
    return 0;
}

output 是 12,而不是 16。為什么?

在使用的系統中sizeof( int )等於4 因此,為了對齊數據成員c ,編譯器在變量b之后填充2個字節。 因此,該結構的大小為 12 字節。

如果您聲明數據成員cd具有long類型,您可以獲得更明顯的結果,具體取決於使用的是32位系統還是64位系統。 在大多數 64 位系統中, sizeof( long )等於8

當需要填充字節來滿足任何這些數據成員的 alignment 要求或(更一般地)優化對這些成員的訪問速度時,在結構或 class 的數據成員之間添加填充字節。

現在,雖然int標准未指定 alignment 類型的要求,但同一底層芯片(例如 Intel x86-64 系統)的 32 位和 64 位構建之間可能會有所不同(或不變) ), alignment 對char類型(以及signed charunsigned char的要求由標准指定 來自cppreference

最弱的alignment(要求最小的alignment)是charsigned charunsigned char的alignment,等於1; 任何類型的最大基本 alignment 是實現定義的,等於std::max_align_t (C++11 起)的 alignment。

因此,由於b成員的 alignment 要求為 1,因此ab之間不需要填充。 在您的情況下, alignment 對int的要求是 4 個字節,因此必須在c成員之前添加兩個填充字節。 因此,2 × sizeof(char) (= 2) + 2 個填充字節 + 2 × sizeof(int) (=8) 給出了 12 個字節的總大小。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM