結構體的對齊方式必須是程式設計師所了解的,關於記憶體對齊方式的優點和部分知識可以參閱http://www.ibm.com/developerworks/library/pa-dalign/
結構體占用的儲存空間(struct & sizeof)
概要:結構體所占用的空間只可能是 1,2,4,6,8.........
結構體的記憶體布局依賴於cpu、作業系統、編譯器及編譯時的對齊選項
讀者先了解下基本單個結構體的對齊原則
以下均為32位下的c/c++編譯器
關於結構體的儲存方式:
型所占用的位元組數的倍數
2:結構的總大小必須為占用空間最大的那個變數型別的空間的倍數。
struct stu ;
sizeof(struct stu); //1 空結構體也會被分配乙個位元組的空間
struct stu ;
sizeof(struct stu) ; //3
struct stu ;
sizeof(struct stu) ; //12
struct stu ;
sizeof(struct stu) ; //8
struct stu
sizeof(struct stu) ; //24
struct stu
sizeof(struct stu) ; //16
#pragma pack(push) //儲存對齊方式
#pragma pack(n)
#pragma pack(pop) //恢復對齊方式
設定變數以n位元組對齊方式,
n位元組對齊是指變數存放的起始位址
的偏移量有兩種情況:
第一:如果n大於等於該變數型別所占用的位元組數,那麼偏移量必須滿足預設的對
齊方式。
第二:如果n小於該變數的型別所占用的位元組數,那麼偏移量為n的倍數,不是默
認對齊方式。
#pragma pack(4)
struct stu
sizeof(struct stu) ; //16 滿足條件二 < n
struct stu ;
sizeof(struct stu); //4 滿足條件一 n>= 但是還得結構的總大小必須為占用空間最大的
那個變數型別的空間的倍數。
struct stu ;
sizeof(struct stu); //6
現在我們來介紹巢狀結構的記憶體對齊方式,
c/c++原始碼:
#include
union a
; // 8 位元組
typedef struct
b; // 16
class c
; int main(void)
結構:8---16---32
計算方法: 將結構體內部的結構體全部拆分成單個資料元素,然後按上面的記憶體對齊方式計算即可。(注意union,不需拆分)
所以class c 拆分後:
class c
int date; //1個位元組所以其記憶體布局是(從低位元組到高位元組,padding代表填充位元組)union a a1; // 注意union 不需拆 8個位元組,可等同double
char y; //1個位元組
union a a2; //8個位元組
char date union a a1 char y union a a2
4 + 4padding + 8 + 1 + 7padding + 8 = 32 個位元組
struct 結構體內存對齊方式
以下都以32位機器為例分析結構體型別的變數在記憶體裡的儲存 一 1.結構體變數的儲存位置都是在記憶體中尋找位址是該變數自身大小整數倍開始儲存的。2.結構體型別變數的總大小應是該型別成員中最大資料型別的整數倍。就此兩點,可以解決所有問題,對於第一條,應該注意每一位成員存放的首位址定為自身的整數倍。例子...
關於結構體,記憶體對齊,sizeof
程式設計師寶典中,關於結構體對齊問題,看了一晚上帖子,包括記憶體,cpu等等的,現在總算有些理解 要弄清結構體對齊,首先要明白為什麼要對齊?1.先想想簡單的hello.c整個執行過程中外設,記憶體,cpu的工作過程 計算機的所有工作都是要經過記憶體的,包括網頁得讀取等等 我們平時說的32位機器是指指...
關於結構體內存對齊總結
記憶體對齊計算可謂是筆試題的必考題,但是如何按照計算原則算出正確答案一開始也不是很容易的事,所以專門通過例子來複習下關於結構體內存對齊的計算問題。編譯環境為vs2015 對齊原則 原則1 資料成員對齊規則 結構 struct 或聯合 union 的資料成員,第乙個資料成員放在offset為0的地方,...