結構體的記憶體布局

2022-08-30 19:06:10 字數 1077 閱讀 3322

看《thinking in c++》的時候有下面一段**:

#include using namespace std;

struct a;

struct b;

void b::f() {}

int main()

作者說sizeof(a)很容易理解,但是sizeof(b)不是0有些不正常。他解釋到這是因為c++不允許兩個object的記憶體位址是一樣的,如果sizeof(b) = 0,那麼兩個連續的struct b的變數的定義,就會導致這兩個變數的位址一樣。

而我在想的卻是另外乙個問題:struct b的大小不應該是4嗎?它應該要存函式f()的位址啊。但結果卻是1。這個1只是為了讓變數的位址有所區別吧。google了一下之後,發現我的想法只是我的一廂情願。

1. 函式f()的**是在**段的某個位置;

2. 因為f()對於多個struct b變數是公共的,它的位址對所有的struct b變數是一樣的,它根本就不需要存放在每個struct b變數裡。f()的位址應該是在編譯的時候就已經確定了的。

這樣的話,所有的函式都是不用佔空間的(虛函式除外,那是另外一回事了);仔細一想,這種做法確實比在每個struct變數裡存放函式位址的做法要好,而且,更重要的一點,它實現了與c的相容性。c的結構體是不能帶有成員函式的。c++的實現方式使得下面的兩個結構體是完全一樣的:

// c struct

struct c;

// c++ struct

struct cpp;

如果用sizeof()檢視的話,struct c和struct cpp占用的記憶體是一樣的。都是4。甚至可以在struct c和struct cpp之間進行任意轉換,因為它們的記憶體布局是完全一樣的。

#include using namespace std;

// c struct

struct c;

// c++ struct

struct cpp;

int main()

輸出的結果是:

value = 100

value = 200

結構體的記憶體布局

為了提高記憶體訪問效率,降低處理器從記憶體讀取資料的開支,各種資料型別的物件並不是連續存放在記憶體中的任意起始位址上的,而是盡可能的對齊到機器字長上面。編譯器出於優化的考慮,會給各種資料型別的變數在記憶體的儲存方式施加限制,我們可以從兩個方面來考慮這個問題,乙個是對齊 alignment 另乙個就是...

結構體對齊 結構體內存布局

在c語言中,可以通過 pragma pack n 來指定結構體按n位元組對齊 這裡的n是2的較小整數次冪 如果程式設計者不指定對齊位元組數,那麼預設的會按照結構體中最長那一項對齊,如在64位作業系統中,當結構體中出現 void long 型別,則必然是按照8位元組對齊 當最大的是int,那麼就按照4...

熟悉結構體 結構體的記憶體對齊

結構的宣告注意問題。結構體成員的訪問 結構變數的成員是通過點操作符 訪問的。如果是結構體指標,則用 結構體的自引用 struct node 結構體內存對齊 為什麼要存在記憶體對齊?1.平台問題 移植原因 不是所有的硬體平台都能訪問任意位址上的任意資料的 某些硬體平台只能在某些位址處取某些特定型別的資...