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

溫馨提示×

溫馨提示×

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

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

如何對齊C++的內存

發布時間:2021-01-12 14:59:37 來源:億速云 閱讀:139 作者:Leah 欄目:開發技術

如何對齊C++的內存?針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

下面是不同位數編譯器下基本數據類型對應的字節數。

32位編譯器:

char :1個字節
char*(即指針變量): 4個字節
short int : 2個字節
int: 4個字節
unsigned int : 4個字節
float: 4個字節
double:  8個字節
long:  4個字節
long long: 8個字節
unsigned long: 4個字節

64位編譯器:

char :1個字節
char*(即指針變量): 8個字節
short int : 2個字節
int: 4個字節
unsigned int : 4個字節
float: 4個字節
double:  8個字節
long:  8個字節
long long: 8個字節
unsigned long: 8個字節

總結:32位和64位編譯器的基本數據類型字節數主要差別在64位的指針和long為8字節。

C++內存對齊

  • 眾所周知,為了保證每個對象擁有彼此獨立的內存地址,C++空類的內存大小為1字節。而非空類的大小與類中非靜態成員變量和虛函數表的多少有關。其中,類中非靜態成員變量的大小則與編譯器的位數以及內存對齊的設置有關。

  • 類中的成員變量在內存中并不一定是連續的。它是按照編譯器的設置,按照內存塊來存儲的,這個內存塊大小的取值,就是內存對齊。

  • 內存對齊有2個規則:

1.第一個成員變量放在類中內存offset為0的地方,之后的成員變量的對齊按照#pragma pack(n)指定的數值和這個成員變量類型所占字節數中,比較小的那個進行(成員變量間補齊)。
2.在成員變量完成各自內存對齊之后,類(結構或聯合)本身也要進行內存對齊,對齊按照#pragma pack(n)指定的數值和類中最大成員變量類型所占字節數中,比較小的那個進行(類中最后一個成員變量結尾后補齊),類大小需要是對齊值得整數倍。

  • \#pragma pack(n)作為一個預編譯指令用來設置內存對齊的字節數。需要注意的是,n的缺省數值是編譯器設置的,一般為8,合法的數值分別是1、2、4、8、16。

延伸知識:C++空類大小

  • C++標準指出,不允許一個對象(當然包括類對象)的大小為0,不同的對象不能具有相同的地址。這是由于:

new需要分配不同的內存地址,不能分配內存大小為0的空間
避免除以sizeof(T)時得到除以0錯誤故使用一個字節來區分空類。

  • 需要注意的是,這并不代表一個空基類也需要加一個字節到子類中去。這種情況下,空基類并不是獨立的,它附屬于子類。子類繼承空基類后,子類如果有自己的數據成員,則空基類的那一個字節并不會加到子類中去。

關于如何對齊C++的內存問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

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

c++
AI

平安县| 陇西县| 措美县| 当雄县| 沙洋县| 东辽县| 泸水县| 土默特左旗| 山丹县| 登封市| 咸阳市| 鄂托克前旗| 新化县| 梁河县| 武功县| 高雄市| 迁西县| 阿拉善左旗| 常宁市| 鄄城县| 巴东县| 灵璧县| 靖宇县| 城步| 罗城| 西充县| 平度市| 隆化县| 积石山| 新巴尔虎左旗| 大洼县| 伊通| 宁陵县| 板桥市| 汤阴县| 克拉玛依市| 仙桃市| 谢通门县| 淮南市| 永城市| 韩城市|