首先看一下內建資料型別的記憶體占用問題,如下表所示(win32):
name
size
range*
char
1byte
signed: -128 to 127
unsigned: 0 to 255
short int (short)
2bytes
signed: -32768 to 32767
unsigned: 0 to 65535
int4bytes
signed: -231 to 231-1
unsigned: 0 to 232-1
long int (long)
4bytes
signed: -231 to 231-1
unsigned: 0 to 232-1
bool
1byte
true or false
float
4bytes
+/- 3.4e +/- 38 (~7 digits)
double
8bytes
+/- 1.7e +/- 308 (~15 digits)
long double
8bytes
+/- 1.7e +/- 308 (~15 digits)
另外,指標(不管指向什麼型別),所佔記憶體為4個位元組;記憶體對齊問題有四條規則:
1、第乙個成員變數與結構體變數的偏移量為0;
2、其他成員變數要對齊到某個數字(對齊數)整數倍的位置;
3、對齊數取編譯器預設對齊數與該成員大小的較小值;
4、結構體總大小為最大對齊數的整數倍;
驗證**如下:
#include using namespace std;
int main()
; struct test2
; cout<
結構體struct(或聯合union)的記憶體占用問題涉及到位元組對齊,在vs裡可以進行設定,工程屬性 -> 配置屬性 -> c/c++ -> **生成 -> 結構成員對齊,如下圖:
如果選擇4位元組對齊,成員變數記憶體占用不到4位元組的,相鄰幾個變數湊夠4位元組的整數倍,執行結果為:
如果選擇8位元組對齊,成員變數記憶體占用不到4位元組的,相鄰幾個變數湊夠4位元組的整數倍,執行結果為:
結構體內存對齊問題
問題描述 結構體內存對齊問題值直接的體現就是計算結構體的sizeof占用的位元組數。結構體內存對齊的幾個原則,有了這幾個原則,不管結構體裡面是什麼元素,我們都能夠正確算出sizeof值 以vs2013為例 原則2 在原則1的基礎上,檢查計算出的儲存單元是否為所有元素中最寬的元素的長度的整數倍,是,則...
結構體內存對齊問題
今天參加的c c 筆試,總的來說,感覺已經比以前好多了,相信是每天及時總結的緣故,廢話不多說,下面繼續堅持。今天大致做了三塊內容,首先計算機網路通訊,然後是資料結構部分,最後才是c c 的題目。前兩者另外再做小結,先就c c 1 記憶體對齊問題 對這個問題,以前我也總結過,一段時間沒有回看盡然有點忘...
結構體內存對齊問題
假設cpu要讀取乙個4位元組大小的資料到暫存器中 假設記憶體讀取粒度是4 分兩種情況討論 1.資料從0位元組開始 記憶體對齊 2.資料從1位元組開始 記憶體不對齊 當資料從1位元組開始的時候,問題很複雜,首先先將前4個位元組讀到暫存器,並再次讀在這裡插入 片了這麼多額外操作,大大降低了cpu 的效能...