記憶體對齊:編譯器將程式中的每個「資料單元」安排在適當的位置上。
舉乙個例子:
//32位系統
#includeusing namespace std;
structs;
int main()
問題:上述**的輸出是多少?
答案:8
為什麼要額外的3位元組去填充這個結構體?乙個原本5位元組的結構現在變成8 位元組,幾乎擴大了 2 倍的儲存空間,這樣的空間開銷是否值得?又是什麼樣的原因導致這樣的設計?
記憶體是以位元組為單位儲存,但是處理器並不會按照乙個位元組為單位去訪問記憶體。處理器訪問記憶體是塊為單位,塊的大小可以是2,4,8,16位元組大小,這樣的訪問單位稱為記憶體訪問粒度。如果在64位的機器上,不論cpu是要讀取第0個位元組還是要讀取第1個位元組,在硬體上傳輸的訊號都是一樣的。因為它都會把位址0到位址7,這8個位元組全部讀到cpu,只是當我們是需要讀取第0個位元組時,丟掉後面7個位元組,當我們是需要讀取第1個位元組,丟掉第1個和後面6個位元組。所以對於計算機硬體來說,記憶體只能通過特定的對齊位址進行訪問。
從記憶體訪問效率方面考慮,記憶體對齊的情況下可以提公升cpu訪問記憶體的效率。比如有乙個整型變數(4 位元組),現在有一塊記憶體單元: 位址從 0~7。這個整型變數從 位址為 1 的位置開始佔據了 1,2,3,4 這 4 個位元組。 現在處理器需要讀取這個整型變數。假設處理器是 4 位元組 4 位元組的讀取,所以從 0 開始讀讀取 0,1,2,3發現並沒有讀完整這個變數,那麼需要再讀一次,讀取 4,5,6,7。然後對兩次讀取的結果進行處理,提取出 1,2,3,4 位址的內容。需要兩次訪問記憶體,同時通過一些邏輯計算才能得到最終的結果。如果進行記憶體對齊,將這個整型變數放在從0開始的位址存放,那麼cpu只需要一次記憶體讀取,並且沒有額外的邏輯計算。可見記憶體對齊之後訪問的效率提公升了1倍。
總結:
通過填充欄位padding使得結構體大小與機器字倍數對齊是一種常見的做法。顯然記憶體對齊是會浪費一些空間的。但是這種空間上得浪費卻可以減少訪問的時間。這是典型的一種以空間換時間的做法。在記憶體越來越便宜的今天,這一點點的空間上的浪費就不算什麼了。因為訪問記憶體的速度對於處理來說是非常非常的慢, 記憶體訪問速率對於現在 cpu 來說越來越跟不上, 額外的記憶體訪問無疑是浪費 cpu的。
答案: 空的類或者結構體的大小是1個位元組,因為c++當中每個例項在記憶體中都有乙個獨一無二的位址,為了達到這個目的,編譯器往往會給乙個空類隱含的加乙個位元組,這樣空類在例項化後在記憶體得到了獨一無二的位址。
struct a // sizeof (a) == 12
;struct b // sizeof (b) == 8
;
答案:成員宣告順序會影響結構體大小。 hadoop相關 HBase體系結構
hbase的體系結構遵從主從伺服器架構 主 hbase master 從 hregion server群 hbase中所有的伺服器都是通過zookeeper來協調 並處理執行期間可能出現的錯誤。一 邏輯模型 以nutch 2.0下hbase存放資料的表 webpage 為例 describe 由表的...
mysql 體系結構 了解MySQL體系結構
mysql 資料庫體系結構圖 mysql 由以下幾部分組成 1 connectors 不同語言中與 sql 的互動 show variables like connection variable name value character set connection utf8 collation c...
簡述mysql體系結構 MySQL體系結構
一 mysql登入方式 一 tcp ip方式 遠端 本地 mysql uroot poldboy123 h 10.0.0.51 p3306 二 socket方式 mysql uroot poldboy123 s tmp mysql.sock 二 例項介紹 例項 mysqld後台守護程序 主線程 ma...