最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言詳解結構體的內存對齊與大小計算

 更新時間:2022年04月23日 17:03:27   作者:CodeWinter  
C 數(shù)組允許定義可存儲相同類型數(shù)據(jù)項的變量,結構是 C 編程中另一種用戶自定義的可用的數(shù)據(jù)類型,它允許你存儲不同類型的數(shù)據(jù)項,本篇讓我們來了解C 的結構體內存對齊與計算大小

結構體的內存對齊

1、計算結構體的大小

struct S1
{
	char c1; // 1 byte,默認對齊數(shù)為8,所以c1的對齊數(shù)是1,第一個成員變量放在與結構體變量偏移量為0的地址處
	int i;   // 4 byte,默認對齊數(shù)為8,所以i的對齊數(shù)是4,所以i要放到偏移量為 4的整數(shù)倍 的地址處
	char c2; // 1 byte,默認對齊數(shù)為8,所以c2的對齊數(shù)是1,所以c2要放到偏移量為 1的整數(shù)倍 的地址處
	//最大對齊數(shù)是4
	//成員大小為9,不是最大對齊數(shù)4的整數(shù)倍,所以結構體總大小為12
};
printf("%d\n", sizeof(struct S1));

原理分析:

【練習題】

// 練習1
struct S2
{
	char c1;  // 1 byte / 8,對齊數(shù)是1,
	char c2;  // 1 byte / 8,對齊數(shù)是1,
	int i;    // 4 byte / 8,對齊數(shù)是4,
	// 最大對齊數(shù)是4
	// 成員大小為8,是最大對齊數(shù)的整數(shù)倍,所以結構體總大小為8
};
printf("%d\n", sizeof(struct S2));

// 練習2
struct S3
{
	
	char c;   // 1/8,對齊數(shù)是1
	int i;    // 4/8,對齊數(shù)是4
	double d; // 8/8,對齊數(shù)是8
	// 最大對齊數(shù)是8
	// 成員大小為16,是最大對齊數(shù)的整數(shù)倍,所以結構體總大小為16
};
printf("%d\n", sizeof(struct S3));

// 練習3-結構體嵌套問題
struct S4
{
	char c1;      //  1/8,對齊數(shù)是1
	struct S3 s3; // 16 byte,【S3的最大對齊數(shù)是8】,所以s3要放到8的整數(shù)倍的地址處
	double d;     //  8/8,對齊數(shù)是8
	// 最大對齊數(shù)是8
	// 成員大小為32,是最大對齊數(shù)的整數(shù)倍,所以結構體總大小為32
};
printf("%d\n", sizeof(struct S4));

2、結構體的對齊規(guī)則

第一個成員變量在與結構體變量偏移量為 0 的地址處。

其他成員變量要對齊到某個數(shù)字(對齊數(shù))的整數(shù)倍的地址處。

  • 對齊數(shù) =「編譯器默認的一個對齊數(shù)」與「該成員大小」中的較小值。
  • VS中默認對齊數(shù)為「8」,Linux中沒有對齊數(shù)

結構體總大小為:最大對齊數(shù)(每個成員變量都有一個對齊數(shù))的整數(shù)倍。

如果嵌套了結構體的情況,嵌套的結構體對齊到自己的最大對齊數(shù)的整數(shù)倍處,結構體的整體大小就是所有最大對齊數(shù)(含嵌套結構體的對齊數(shù))的整數(shù)倍。

3、為什么存在內存對齊?

大部分的參考資料是這樣說的:

  • 平臺原因(移植原因): 不是所有的硬件平臺都能訪問任意地址上的任意數(shù)據(jù)的;某些硬件平臺只能在某些地址處取某些特定類型的數(shù)據(jù),否則拋出硬件異常。(那我們就要將數(shù)據(jù)對齊到能夠訪問的這些地址處)
  • 性能原因:數(shù)據(jù)結構(尤其是棧)應該盡可能地在自然邊界上對齊。 原因在于,為了訪問未對齊的內存,處理器需要作兩次內存訪問;而對齊的內存訪問僅需要一次訪問。

4、總結

結構體的內存對齊是拿空間來換取時間的做法。

思考:那在設計結構體的時候,我們既要滿足對齊,又要節(jié)省空間,如何做到:

讓占用空間小的成員盡量集中在一起。

// 例如:
struct S1
{
	char c1;  // 1/8,對齊數(shù)是1
	int i;    // 4/8,對齊數(shù)是4
	char c2;  // 1/8,對齊數(shù)是1
	// 最大對齊數(shù)是4
	// 成員大小為9,不是最大對齊數(shù)的整數(shù)倍,所以結構體總大小為12
};

struct S2
{
	char c1;  // 1/8,對齊數(shù)是1
	char c2;  // 1/8,對齊數(shù)是1
	int i;    // 4/8,對齊數(shù)是4
	// 最大對齊數(shù)是4
	// 成員大小為8,是最大對齊數(shù)的整數(shù)倍,所以結構體總大小為8
};

S1和S2類型的成員一模一樣,但是S1和S2所占空間的大小卻有了一些區(qū)別。

到此這篇關于C語言詳解結構體的內存對齊與大小計算的文章就介紹到這了,更多相關C語言結構體內存對齊內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 詳解C語言中的自定義類型

    詳解C語言中的自定義類型

    這篇文章主要為大家詳細介紹了C語言中的四大自定義類型(結構體、位段、枚舉和聯(lián)合)的相關知識,文中的示例代碼簡潔易懂,需要的可以參考一下
    2023-07-07
  • C++中set的用法學習

    C++中set的用法學習

    Set是C++?STL(標準模板庫)的一個容器類,它用于存儲不同的值,并且可以按照特定順序進行訪問和操作。本文就來通過一些示例和大家簡單講講set的用法吧
    2023-05-05
  • C++中十種內部排序算法的比較分析

    C++中十種內部排序算法的比較分析

    本文給大家分享的是個人寫的一段對C++中十種內部排序算法的比較分析的代碼,主要在于測試10種排序方法的性能,給大家參考下吧。
    2015-03-03
  • C語言實現(xiàn)五子棋對戰(zhàn)系統(tǒng)

    C語言實現(xiàn)五子棋對戰(zhàn)系統(tǒng)

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)五子棋對戰(zhàn)系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • C語言魔方陣的三種實現(xiàn)方法

    C語言魔方陣的三種實現(xiàn)方法

    大家好,本篇文章主要講的是C語言魔方陣的三種實現(xiàn)方法,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • C語言怎么連接兩個數(shù)組的內容你知道嗎

    C語言怎么連接兩個數(shù)組的內容你知道嗎

    這篇文章主要為大家介紹了C語言怎么連接兩個數(shù)組的內容,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • Jsoncpp的安裝與使用方式

    Jsoncpp的安裝與使用方式

    JsonCpp是一個用于解析和生成JSON數(shù)據(jù)的C++庫,它支持解析JSON文件或字符串到C++對象,以及將C++對象序列化回JSON格式,安裝JsonCpp可以通過命令安裝,默認安裝動態(tài)庫,JsonCpp的使用主要涉及三個類:Json::Value用于表示JSON值
    2025-01-01
  • C語言 map函數(shù)的基礎用法詳解

    C語言 map函數(shù)的基礎用法詳解

    這篇文章主要為大家介紹了C語言 map函數(shù)的基礎用法,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • C語言中switch語句基本用法實例

    C語言中switch語句基本用法實例

    switch的中文翻譯是開關,顧名思義,開關的作用就是控制連通或者中斷,在C語言中switch語句的作用也是大同小異,下面這篇文章主要給大家介紹了關于C語言中switch語句基本用法的相關資料,需要的朋友可以參考下
    2022-07-07
  • Qt編寫地圖實現(xiàn)實時動態(tài)軌跡效果

    Qt編寫地圖實現(xiàn)實時動態(tài)軌跡效果

    實時動態(tài)軌跡主要是需要在地圖上動態(tài)顯示GPS的運動軌跡,也是編寫地圖時一個重要的功能。本文將利用Qt實現(xiàn)這一功能,需要的可以參考一下
    2022-02-02

最新評論

金乡县| 叶城县| 贞丰县| 千阳县| 崇明县| 涞源县| 改则县| 黔东| 吴堡县| 龙岩市| 东海县| 呼图壁县| 莲花县| 平湖市| 陵水| 汝州市| 乌拉特前旗| 浦县| 吉安市| 阳曲县| 永德县| 阿巴嘎旗| 文山县| 广西| 邹城市| 子长县| 措美县| 新民市| 和林格尔县| 凤翔县| 游戏| 罗甸县| 育儿| 彩票| 交口县| 武乡县| 霍山县| 黔江区| 新郑市| 合川市| 滁州市|