為什麼是8啊,把char c注釋掉結果是4,把int a 注釋掉結果是1.但是為什麼在一起就是8了。不明白清前輩指教!
以下為對此種現象的解釋:
原來是記憶體對齊造成的。
英文名叫做memory alignment
大部分16位和32位的cpu不允許將字或者長字儲存到記憶體中的任意位址. 比如motorola 68000不允許將16位的字儲存到奇數字址中, 將乙個16位的字寫到奇數字址將引發異常.
實際上, 對於c中的位元組組織, 有這樣的對齊規則:
單個位元組(char)能對齊到任意位址
2位元組(short)以2位元組邊界對齊
4位元組(int, long)以4位元組邊界對齊
不同cpu的對其規則可能不同, 請參考手冊.
為什麼會有上述的限制呢? 理解了記憶體組織, 就會清楚了
cpu通過位址匯流排來訪問記憶體中的資料, 32位的cpu的位址匯流排寬度既為32位置, 標為a[0:31]. 在乙個匯流排週期內, cpu從記憶體讀/寫32位. 但是cpu只能在能夠被4整除的位址進行記憶體訪問, 這是因為: 32位cpu不使用位址匯流排的a1和a2. (比如arm, 它的a[0:1]用於位元組選擇, 用於邏輯控制, 而不和儲存器相連, 儲存器連線到a[2:31].)
訪問記憶體的最小單位是位元組(byte), a0和a1不使用, 那麼對於位址來說, 最低兩位是無效的, 所以它只能識別能被4整除的位址了. 在4位元組中, 通過a0和a1確定某乙個位元組.
看下面的**
#include
using namespace std;
class test
;int main()
{test a;
cout<
C 類 記憶體對齊和類大小理解
首先,預設的塊對齊長度是4位元組,此外也可以通過 pragma pack x 修改,同時,自己修改完之後記得使用 pragma pack 恢復預設值。此外,又分了幾種情況 1 如果有虛函式,則會儲存虛函式表的位址 僅乙個位址,4位元組或8位元組 該位址是存放在類記憶體的最開始的地方。2 如果出現比x...
C 類中的記憶體對齊
在沒有 pragma pack巨集的情況下 1.資料成員對齊規則 struct,union的資料成員,第乙個資料成員放在offset為0的地方,之後的資料成員的儲存起始位置都是放在該資料成員大小的整數倍位置。如在32bit的機器上,int的大小為4,因此int儲存的位置都是4的整數倍的位置開始儲存。...
C中記憶體對齊問題
1 對於基本資料型別 許多計算機系統對基本資料型別可允許位址作了一定的限制,要求某種型別物件的位址必須是某個值n 通常是2 4 8 的倍數,從而來簡化處理器和儲存器之間的介面的硬體設計。如linux的對齊策略是2位元組資料型別,例如short的位址必須是2的倍數。而較大的資料型別如 int int ...