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

操做系統64位和32位有什麼區別?

64位操做系統意味着其cpu擁有更大的尋址能力。理論上來講,其性能相比於32位操做系統會提高1倍。可是這也須要在64位操做系統上運行的軟件也是64位的。編程

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


 

數據類型對應字節數

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

32位編譯器:

char:1個字節函數

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

shortint:2個字節學習

int:4個字節ui

unsignedint:4個字節spa

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,合法的數值分別是一、二、四、八、16。


 

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

C++標準指出,不容許一個對象(固然包括類對象)的大小爲0,不一樣的對象不能具備相同的地址。這是因爲:

new須要分配不一樣的內存地址,不能分配內存大小爲0的空間

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

須要注意的是,這並不表明一個空基類也須要加一個字節到子類中去。這種狀況下,空基類並非獨立的,它附屬於子類。子類繼承空基類後,子類若是有本身的數據成員,則空基類的那一個字節並不會加到子類中去。


 

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

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

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

編程學習書籍:


 

編程學習視頻:


 

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

相關文章
相關標籤/搜索