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

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

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

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

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

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

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

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

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

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

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

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

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

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

例1:

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

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

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

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

(4)此時(shí)內(nèi)存中共有9個(gè)字節(jié),進(jìn)行結(jié)構(gòu)體整體對(duì)齊,最大對(duì)齊數(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)在我們計(jì)算一下S2的大?。?/p>

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

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

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

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

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

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

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

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

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

如何計(jì)算一個(gè)對(duì)象的大小

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

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

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

總結(jié)

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

相關(guān)文章

  • C語(yǔ)言指針和數(shù)組深入探究使用方法

    C語(yǔ)言指針和數(shù)組深入探究使用方法

    在C語(yǔ)言和C++等語(yǔ)言中,數(shù)組元素全為指針變量的數(shù)組稱為指針數(shù)組,指針數(shù)組中的元素都必須具有相同的存儲(chǔ)類型、指向相同數(shù)據(jù)類型的指針變量。指針數(shù)組比較適合用來(lái)指向若干個(gè)字符串,使字符串處理更加方便、靈活
    2022-08-08
  • C?語(yǔ)言的弱符號(hào)與弱引用你了解嗎

    C?語(yǔ)言的弱符號(hào)與弱引用你了解嗎

    這篇文章主要為大家詳細(xì)介紹了C?語(yǔ)言弱符號(hào)與弱引用,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-03-03
  • FFmpeg中avfilter模塊的介紹與使用

    FFmpeg中avfilter模塊的介紹與使用

    FFmpeg中的libavfilter模塊(或庫(kù))用于filter(過(guò)濾器),?filter可以有多個(gè)輸入和多個(gè)輸出,下面就跟隨小編一起簡(jiǎn)單學(xué)習(xí)一下它的巨日使用吧
    2023-08-08
  • c++雙向鏈表操作示例(創(chuàng)建雙向鏈、雙向鏈表中查找數(shù)據(jù)、插入數(shù)據(jù)等)

    c++雙向鏈表操作示例(創(chuàng)建雙向鏈、雙向鏈表中查找數(shù)據(jù)、插入數(shù)據(jù)等)

    這篇文章主要介紹了c++雙向鏈表操作示例,包括創(chuàng)建雙向鏈、刪除雙向鏈表、雙向鏈表中查找數(shù)據(jù)、插入數(shù)據(jù)等,需要的朋友可以參考下
    2014-05-05
  • static全局變量與普通的全局變量的區(qū)別詳細(xì)解析

    static全局變量與普通的全局變量的區(qū)別詳細(xì)解析

    以下是對(duì)static全局變量與普通的全局變量的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助
    2013-09-09
  • 論C++的lambda是函數(shù)還是對(duì)象

    論C++的lambda是函數(shù)還是對(duì)象

    這篇文章主要介紹了論C++的lambda是函數(shù)還是對(duì)象,對(duì)于有捕獲的lambda,其等價(jià)于對(duì)象。對(duì)于沒(méi)有任何捕獲的lambda,其等價(jià)于函數(shù),下面來(lái)看看具體的相關(guān)內(nèi)容,需要的朋友可以參考一下
    2022-02-02
  • QT實(shí)現(xiàn)將兩個(gè)時(shí)間相加的算法[hh:?mm?+?hh:?mm]的示例代碼

    QT實(shí)現(xiàn)將兩個(gè)時(shí)間相加的算法[hh:?mm?+?hh:?mm]的示例代碼

    本文主要介紹了QT實(shí)現(xiàn)將兩個(gè)時(shí)間相加的算法[hh:?mm?+?hh:?mm]的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • VC多線程編程詳解

    VC多線程編程詳解

    這篇文章主要介紹了VC多線程編程,實(shí)例形式詳細(xì)分析了多線程編程的原理與實(shí)現(xiàn)方法,具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2014-10-10
  • 詳解C語(yǔ)言之單鏈表

    詳解C語(yǔ)言之單鏈表

    這篇文章主要為大家介紹了C語(yǔ)言的單鏈表,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2021-11-11
  • C++ Boost PointerContainer智能指針詳解

    C++ Boost PointerContainer智能指針詳解

    智能指針是一種像指針的C++對(duì)象,但它能夠在對(duì)象不使用的時(shí)候自己銷毀掉。雖然STL提供了auto_ptr,但是由于不能同容器一起使用(不支持拷貝和賦值操作),因此很少有人使用。它是Boost各組件中,應(yīng)用最為廣泛的一個(gè)
    2022-11-11

最新評(píng)論

台中市| 佛冈县| 桃江县| 会宁县| 贵定县| 鹿泉市| 崇礼县| 丹阳市| 沽源县| 宁武县| 宾川县| 黄冈市| 漠河县| 安庆市| 宾川县| 临夏市| 红河县| 茶陵县| 利川市| 秦皇岛市| 左权县| 三门县| 陇南市| 原平市| 宜兴市| 莒南县| 信阳市| 临城县| 桑植县| 吉隆县| 来宾市| 吉水县| 齐齐哈尔市| 积石山| 水富县| 高邮市| 台中县| 都江堰市| 东至县| 商河县| 克拉玛依市|