中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么在C++中計算結構體與對象的大小

發布時間:2021-05-08 16:48:45 來源:億速云 閱讀:358 作者:Leah 欄目:開發技術

今天就跟大家聊聊有關怎么在C++中計算結構體與對象的大小,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。

C語言是什么

C語言是一門面向過程的、抽象化的通用程序設計語言,廣泛應用于底層開發,使用C語言可以以簡易的方式編譯、處理低級存儲器。

如何計算結構體的大小

其實計算一個結構的大小的方法并不難,簡單來說就是把結構體內的所有成員的大小相加就可以。但是,需要內存對齊那么究竟什么是內存對齊,又為什么要進行類型對齊呢?

結構體的內存對齊

結構體內存對齊主要有兩個步驟:

1.結構體各成員對齊.
2.結構體總體對齊

結構體內存對齊規則:

1.結構體的第一個成員在存放在結構體偏移量為0的位置
2.其他成員變量要對齊到某個數字(對齊數)的整數倍的地址處。.

對齊數 = 編譯器默認的一個對齊數與該成員大小的較小值。
/*
**VS中默認的值為8
**Linux中的默認值為4
*/

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

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

說了這么多,我們直接在VS環境下舉幾個例子給大家說明一下:

例1:

struct S1
{
 char c1;
 int i;
 char c2;
};

(1)計算這個結構體的大小的時候,首先看c1的大小是1(char類型),也即是說在結構體中c1存放的位置是結構體偏移量是0的位置

(2)接下來看i占4個字節,根據結構體對齊規則可知,c的有效對齊值為4(4 < 8)對齊到4的整數倍地址,即地址偏移量為4處.(40的位置存放了c1,所以只能從41的位置開始存放)

(3)同(2)得出c2的存儲位置是8

(4)此時內存中共有9個字節,進行結構體整體對齊,最大對齊數是4,即要求是4的整數倍,也就是12

怎么在C++中計算結構體與對象的大小

例2:

struct S1
{
	char c1;
	int i;
	char c2;
};
struct S2
{
	char a1;
	struct S1 s1;
	int i;
};

上面我們知道S1的大小是12,現在我們計算一下S2的大小:

(1)a1占一個字節,放在結構體變量偏移量為0 的地址處.

(2) s1占12個字節,對齊數位4(嵌套的結構體對齊到自己的最大對齊數的整數倍處,S1的最大對齊數是4),40處存放了a1,所以只能從41處開始存放

(3)i占了4字節,對齊數為4,s1一直存放到了15的位置,所以i只能從4*5 = 20的位置開始存儲

(4)現在內存中共有20個字節,成員中最大對齊數是4,整體對齊時為4的倍數,所以結果是20

怎么在C++中計算結構體與對象的大小

注意:默認對齊參數是可以用#pragma pack()設置的,例如下面的這個例子

#include <stdio.h>
#include <Windows.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));
	system("pause");
	return 0;
}

怎么在C++中計算結構體與對象的大小

為什么存在內存對齊

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

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

如何計算一個對象的大小

其實在C++中,結構體和類可以認為是相同的,只是默認的訪問權限不同(struct默認是public,class默認是private ),從這方面來看的話,其實計算一個類/對象的大小的方法和計算結構體的大小的方法是一樣的。
我們來驗證一下:

#include <iostream>
using namespace std;

struct A
{
	int a;
	char b;
	char c;
};
class B
{
	int a;
	char b;
	char c;
};

int main()
{
	cout << sizeof(A) << endl;
	cout << sizeof(B) << endl;
	system("pause");
	return 0;
}

怎么在C++中計算結構體與對象的大小

可以看到,我們對結構體A和類B計算大小是一樣的。

看完上述內容,你們對怎么在C++中計算結構體與對象的大小有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

石林| 九龙城区| 凤冈县| 台南县| 嘉义县| 大方县| 江阴市| 东明县| 车致| 商都县| 筠连县| 上栗县| 育儿| 淮北市| 禄丰县| 南平市| 岑巩县| 丹阳市| 鲁山县| 弥勒县| 台东市| 康平县| 依兰县| 栖霞市| 遂川县| 济源市| 治县。| 荆州市| 绥芬河市| 盱眙县| 准格尔旗| 安阳县| 阿尔山市| 额尔古纳市| 正蓝旗| 阜新市| 库尔勒市| 阿图什市| 双牌县| 泽普县| 揭西县|