C++ | 區別操作系統64位和32位,一文搞懂內存對齊


操作系統64位和32位有什么區別?

64位操作系統意味着其cpu擁有更大的尋址能力。理論上來說,其性能相比於32位操作系統會提升1倍。但是這也需要在64位操作系統上運行的軟件也是64位的。

軟件中數據類型的的字節數大小其實和操作系統是多少位的沒有關系,而是由編譯器決定的。也就是說數據結構占多少位取決於在軟件編譯時我們選擇的是64位還是32位的編譯器。其具體占位數在編譯器已經決定了。


 

數據類型對應字節數

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

32位編譯器:

char:1個字節

char*(即指針變量):4個字節

shortint:2個字節

int:4個字節

unsignedint:4個字節

float:4個字節double:8個字節

long:4個字節

longlong:8個字節

unsignedlong:4個字節

64位編譯器:

char:1個字節

char*(即指針變量):8個字節

shortint:2個字節

int:4個字節

unsignedint:4個字節

float:4個字節

double:8個字節

long:8個字節

longlong:8個字節

unsignedlong:8個字節

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


 

C++內存對齊

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

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

內存對齊有2個規則:

第一個成員變量放在類中內存offset為0的地方,之后的成員變量的對齊按照#pragma pack(n)指定的數值和這個成員變量類型所占字節數中,比較小的那個進行(成員變量間補齊)。

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

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


 

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

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

new需要分配不同的內存地址,不能分配內存大小為0的空間

避免除以sizeof(T)時得到除以0錯誤故使用一個字節來區分空類。

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


 

如果你想更好的提升你的編程能力,學好C語言C++編程!彎道超車,快人一步!

C語言C++學習企鵝圈子】,分享(源碼、項目實戰視頻、項目筆記,基礎入門教程)

歡迎轉行和學習編程的伙伴,利用更多的資料學習成長比自己琢磨更快哦!

編程學習書籍:


 

編程學習視頻:


 

文章來源:https://segmentfault.com/a/1190000038919912?utm_source=tuicool&utm_medium=referral

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM