您好,登錄后才能下訂單哦!
如何對齊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++空類的內存大小為1字節。而非空類的大小與類中非靜態成員變量和虛函數表的多少有關。其中,類中非靜態成員變量的大小則與編譯器的位數以及內存對齊的設置有關。
類中的成員變量在內存中并不一定是連續的。它是按照編譯器的設置,按照內存塊來存儲的,這個內存塊大小的取值,就是內存對齊。
內存對齊有2個規則:
1.第一個成員變量放在類中內存offset為0的地方,之后的成員變量的對齊按照#pragma pack(n)指定的數值和這個成員變量類型所占字節數中,比較小的那個進行(成員變量間補齊)。
2.在成員變量完成各自內存對齊之后,類(結構或聯合)本身也要進行內存對齊,對齊按照#pragma pack(n)指定的數值和類中最大成員變量類型所占字節數中,比較小的那個進行(類中最后一個成員變量結尾后補齊),類大小需要是對齊值得整數倍。
\#pragma pack(n)作為一個預編譯指令用來設置內存對齊的字節數。需要注意的是,n的缺省數值是編譯器設置的,一般為8,合法的數值分別是1、2、4、8、16。
C++標準指出,不允許一個對象(當然包括類對象)的大小為0,不同的對象不能具有相同的地址。這是由于:
new需要分配不同的內存地址,不能分配內存大小為0的空間
避免除以sizeof(T)時得到除以0錯誤故使用一個字節來區分空類。
需要注意的是,這并不代表一個空基類也需要加一個字節到子類中去。這種情況下,空基類并不是獨立的,它附屬于子類。子類繼承空基類后,子類如果有自己的數據成員,則空基類的那一個字節并不會加到子類中去。
關于如何對齊C++的內存問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。