欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++如何計算結(jié)構(gòu)體與對象的大小

 更新時間:2021年05月08日 15:03:05   作者:℃絕心戀  
這篇文章主要給大家介紹了關(guān)于C++如何計算結(jié)構(gòu)體與對象大小的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

如何計算結(jié)構(gòu)體的大小

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

結(jié)構(gòu)體的內(nèi)存對齊

結(jié)構(gòu)體內(nèi)存對齊主要有兩個步驟:

1.結(jié)構(gòu)體各成員對齊.
2.結(jié)構(gòu)體總體對齊

結(jié)構(gòu)體內(nèi)存對齊規(guī)則:

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

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

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

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

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

例1:

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

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

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

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

(4)此時內(nèi)存中共有9個字節(jié),進行結(jié)構(gòu)體整體對齊,最大對齊數(shù)是4,即要求是4的整數(shù)倍,也就是12

例2:

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

上面我們知道S1的大小是12,現(xiàn)在我們計算一下S2的大?。?/p>

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

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

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

(4)現(xiàn)在內(nèi)存中共有20個字節(jié),成員中最大對齊數(shù)是4,整體對齊時為4的倍數(shù),所以結(jié)果是20

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

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

為什么存在內(nèi)存對齊

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

2. 性能原因: 數(shù)據(jù)結(jié)構(gòu)(尤其是棧)應(yīng)該盡可能地在自然邊界上對齊。 原因在于,為了訪問未對齊的內(nèi)存,處理器
需要作兩次內(nèi)存訪問;而對齊的內(nèi)存訪問僅需要一次訪問

如何計算一個對象的大小

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

#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;
}

可以看到,我們對結(jié)構(gòu)體A和類B計算大小是一樣的。

總結(jié)

到此這篇關(guān)于C++如何計算結(jié)構(gòu)體與對象大小的文章就介紹到這了,更多相關(guān)C++計算結(jié)構(gòu)體對象大小內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 基于list循環(huán)刪除元素,迭代器失效的問題詳解

    基于list循環(huán)刪除元素,迭代器失效的問題詳解

    下面小編就為大家?guī)硪黄趌ist循環(huán)刪除元素,迭代器失效的問題詳解。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-12-12
  • C語言fprintf()函數(shù)和fscanf()函數(shù)的具體使用

    C語言fprintf()函數(shù)和fscanf()函數(shù)的具體使用

    本文主要介紹了C語言fprintf()函數(shù)和fscanf()函數(shù)的具體使用,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • C語言學(xué)習(xí)基礎(chǔ)知識分享

    C語言學(xué)習(xí)基礎(chǔ)知識分享

    這篇文章主要介紹了C語言學(xué)習(xí)基礎(chǔ)知識分享的相關(guān)資料,需要的朋友可以參考下
    2023-01-01
  • C語言詳解如何實現(xiàn)堆及堆的結(jié)構(gòu)與接口

    C語言詳解如何實現(xiàn)堆及堆的結(jié)構(gòu)與接口

    堆是計算機科學(xué)中一類特殊的數(shù)據(jù)結(jié)構(gòu)的統(tǒng)稱,通常是一個可以被看做一棵完全二叉樹的數(shù)組對象。而堆排序是利用堆這種數(shù)據(jù)結(jié)構(gòu)所設(shè)計的一種排序算法。本文將詳細(xì)介紹堆的結(jié)構(gòu)與接口,需要的可以參考一下
    2022-04-04
  • C++ float、double判斷是否等于0問題

    C++ float、double判斷是否等于0問題

    這篇文章主要介紹了C++ float、double判斷是否等于0問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • VS2019使用Windows桌面應(yīng)用程序模塊創(chuàng)建Win32窗口

    VS2019使用Windows桌面應(yīng)用程序模塊創(chuàng)建Win32窗口

    這篇文章主要介紹了VS2019使用Windows桌面應(yīng)用程序模塊創(chuàng)建Win32窗口,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • C++ 利用硬件加速矩陣乘法的實現(xiàn)

    C++ 利用硬件加速矩陣乘法的實現(xiàn)

    這篇文章主要介紹了C++ 利用硬件加速矩陣乘法的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • C++實現(xiàn)紅黑樹應(yīng)用實例代碼

    C++實現(xiàn)紅黑樹應(yīng)用實例代碼

    紅黑樹它一種特殊的二叉查找樹,這意味著它滿足二叉查找樹的特征,但是也有許多自己的特性,這篇文章主要給大家介紹了關(guān)于C++實現(xiàn)紅黑樹的相關(guān)資料,需要的朋友可以參考下
    2021-11-11
  • C++ 空指針解引用的解決方法

    C++ 空指針解引用的解決方法

    空指針解引用是一種常見且嚴(yán)重的錯誤,它通常由于指針未初始化、被設(shè)置為nullptr或指向無效地址引起,本文主要介紹了C++ 空指針解引用的解決方法,感興趣的可以了解一下
    2024-08-08
  • C/C++中的atan和atan2函數(shù)實例用法

    C/C++中的atan和atan2函數(shù)實例用法

    在本篇文章里小編給大家分享的是一篇關(guān)于C/C++中的atan和atan2函數(shù)實例用法相關(guān)內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。
    2020-02-02

最新評論