C語言程序中結(jié)構(gòu)體的內(nèi)存對(duì)齊詳解
一、為什么存在內(nèi)存對(duì)齊
1.平臺(tái)原因(移植原因): 不是所有的硬件平臺(tái)都能訪問任意地址上的任意數(shù)據(jù)的;某些硬件平臺(tái)只能在某些地址處取某些特定類型的數(shù)據(jù),否則拋出硬件異常。
2. 性能原因: 數(shù)據(jù)結(jié)構(gòu)(尤其是棧)應(yīng)該盡可能地在自然邊界上對(duì)齊。 原因在于,為了訪問未對(duì)齊的內(nèi)存,處理器需要作兩次內(nèi)存訪問;而對(duì)齊的內(nèi)存訪問僅需要一次訪問。
總的來說結(jié)構(gòu)體的內(nèi)存對(duì)齊是拿空間來換取時(shí)間的做法。
二、結(jié)構(gòu)體的內(nèi)存對(duì)齊四規(guī)則
默認(rèn)情況:默認(rèn)的對(duì)齊值 8字節(jié)
1.基本數(shù)據(jù)類型有一個(gè)對(duì)齊值
2.自定義類型有一個(gè)對(duì)齊值 = 內(nèi)部成員類型的最大值
3.程序的指定對(duì)齊值:#pragma pack(n) n == 2的冪次方 n可以等于2 4 8 16 …
4.程序的有效對(duì)齊值:程序的指定對(duì)齊值和數(shù)據(jù)類型對(duì)齊值得較小值
三、舉例
例1
typedef struct Test //8 { char a; //1 + 7 double b; //8 int c; //4 + 4 }Test; void main() { Test t; printf("Test size = %d", sizeof(Test)); }
分析:
char類型占一個(gè)字節(jié),double類型占八個(gè)字節(jié),int占四個(gè)字節(jié);根據(jù)其對(duì)齊規(guī)則,內(nèi)部成員類型的最大值為double(8個(gè)字節(jié)),所以char類型要補(bǔ)齊另外的七個(gè)字節(jié),加上int的四個(gè)字節(jié),一共是:1+7+8+4 = 20,此時(shí)20不是8的倍數(shù),因此int要補(bǔ)四個(gè)字節(jié)。
結(jié)果:
例2
typedef struct Test //8 { char a; //1 + 3 int c; //4 double b; //8 }Test; void main() { Test t; printf("Test size = %d", sizeof(Test)); }
分析同上
結(jié)果:
例3
typedef struct Test { short a; //2 + 6 struct { int b; //4 + 4 double c;//8 char d; //1 + 7 }; int e; //4 + 4 }Test; void main() { Test t; printf("Test size = %d", sizeof(Test)); }
結(jié)果:
例4 程序中有指定對(duì)齊值時(shí)
#pragma pack(2) typedef struct Test { short a; //2 struct { int b; //4 double c;//8 char d; //1 + 1 };//14 int e; //4 }Test; void main() { Test t; printf("Test size = %d", sizeof(Test)); }
結(jié)果:
以上就是C語言程序中結(jié)構(gòu)體的內(nèi)存對(duì)齊詳解的詳細(xì)內(nèi)容,更多關(guān)于C語言結(jié)構(gòu)體內(nèi)存對(duì)齊的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- 詳解C語言如何計(jì)算結(jié)構(gòu)體大小(結(jié)構(gòu)體的內(nèi)存對(duì)齊)
- C語言中結(jié)構(gòu)體的內(nèi)存對(duì)齊規(guī)則講解
- C語言 詳細(xì)分析結(jié)構(gòu)體的內(nèi)存對(duì)齊
- C語言結(jié)構(gòu)體中內(nèi)存對(duì)齊的問題理解
- C語言結(jié)構(gòu)體內(nèi)存對(duì)齊詳解
- C語言熱門考點(diǎn)結(jié)構(gòu)體與內(nèi)存對(duì)齊詳解
- C語言中結(jié)構(gòu)體與內(nèi)存對(duì)齊實(shí)例解析
- C語言結(jié)構(gòu)體內(nèi)存對(duì)齊問題小結(jié)
相關(guān)文章
C++ 中 const和static readonly區(qū)別
這篇文章主要介紹了C++ 中 const和static readonly區(qū)別的相關(guān)資料,需要的朋友可以參考下2017-05-05C語言求圓周率的簡(jiǎn)單實(shí)現(xiàn)方法
這篇文章主要介紹了C語言求圓周率的簡(jiǎn)單實(shí)現(xiàn)方法,涉及C語言數(shù)學(xué)運(yùn)算的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2016-05-05三種獲取網(wǎng)頁源碼的方法(使用MFC/Socket實(shí)現(xiàn))
Windows下比較簡(jiǎn)單的獲取網(wǎng)頁源碼的方法:使用MFC、使用MFC、Socket實(shí)現(xiàn)2013-12-12C++?AVL樹的兩單旋和兩雙旋的項(xiàng)目實(shí)踐
本文主要介紹了C++?AVL樹的兩單旋和兩雙旋的項(xiàng)目實(shí)踐,根據(jù)節(jié)點(diǎn)插入位置的不同,AVL樹的旋轉(zhuǎn)分為四種,下面就來介紹一下,感興趣的可以了解一下2024-03-03C++ std::unique_lock 用法實(shí)例詳解
std::unique_lock 是 C++11 提供的一個(gè)用于管理互斥鎖的類,它提供了更靈活的鎖管理功能,適用于各種多線程場(chǎng)景,這篇文章給大家介紹了C++ std::unique_lock 用法,感興趣的朋友跟隨小編一起看看吧2023-09-09C/C++標(biāo)準(zhǔn)庫之轉(zhuǎn)換UTC時(shí)間到local本地時(shí)間詳解
最近遇到一個(gè)問題:數(shù)據(jù)庫中存放的時(shí)間為UTC時(shí)間,但是現(xiàn)在要求都出來顯示的時(shí)間為本地時(shí)間,所以就用C++實(shí)現(xiàn)了,下面這篇文章主要給大家介紹了關(guān)于C/C++標(biāo)準(zhǔn)庫之轉(zhuǎn)換UTC時(shí)間到local本地時(shí)間的方法,還有C++中獲取UTC時(shí)間精確到微秒的實(shí)現(xiàn)代碼,需要的朋友可以參考下。2017-11-11