日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

C語言詳細分析結構體的內存對齊規則_C 語言

作者:Hero?2021 ? 更新時間: 2022-08-25 編程語言

結構體的內存對齊是一個特別熱門的知識點!

引例

#include<iostream>
using namespace std;
struct S
{
	char c;		// 1
	int a;		// 4
	char d;		// 1
};
int main()
{
	struct S s = { 'a',2,'y'};
	cout << sizeof(struct S) << endl;// 12
	cout << sizeof(s) << endl; 		 // 12
	return 0;
}

結構體內存對齊規則

1. 結構體的第一個變量,永遠放在結構體起始位置偏移量為0的地方。

2. 結構體成員從第二個成員開始,剩下的成員總是放在偏移量為一個對齊數的整數倍處。 對齊數=編譯器默認的對齊數與變量自身大小的較小值(VS的默認對齊數是8,Linux沒有默認對齊數)

3. 結構體的總大小,必須是結構體各個成員中最大對齊數的整數倍

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

滿足第一點:

滿足第二點:

滿足第三步:

為了滿足第三點,我們要內存對齊,結構體的總大小必須是4的倍數,現在只有12能夠滿足要求了。

但是我們存在著一些空間的浪費啊!

那么為什么要有內存對齊呢

大部分的參考資料都是如是說的:

平臺原因(移植原因):

不是所有的硬件平臺都能訪問任意地址上的任意數據的;某些硬件平臺只能在某些地址處取某些特定類型的數據,否則拋出硬件異常。

性能原因:

數據結構(尤其是棧)應該盡可能地在自然邊界上對齊。 原因在于,為了訪問未對齊的內存,處理器需要作兩次內存訪問;而對齊的內存訪問僅需要一次訪問。

例如:某些場景下一次只能讀取4byte空間:對比對齊和不對齊,可能讀取數據就可能出錯。

總體來說:

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

如何優化

?那在設計結構體的時候,我們既要滿足對齊,又要節省空間,如何做到呢? 那就是讓占用空間小的成員盡量集中在一起。

//例如:
struct S1
{
	char c1;
	int i;
	char c2;
};
struct S2
{
	char c1;
	char c2;
	int i;
};

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

修改默認對齊數

#pragma修改默認對齊數

#include <stdio.h>
#pragma pack(8)//設置默認對齊數為8
struct S1
{
	char c1;
	int i;
	char c2;
};
#pragma pack()//取消設置的默認對齊數,還原為默認
#pragma pack(1)//設置默認對齊數為1
struct S2
{
	char c1;
	int i;
	char c2;
};
#pragma pack()//取消設置的默認對齊數,還原為默認
int main()
{
	//輸出的結果是什么?
	printf("%d\n", sizeof(struct S1));
	printf("%d\n", sizeof(struct S2));
	return 0;
}

結論:

結構在對齊方式不合適的時候,我么可以自己更改默認對齊數。

原文鏈接:https://blog.csdn.net/weixin_57675461/article/details/124173090

欄目分類
最近更新