C 中型別 陣列 結構體 類所佔位元組數

2021-10-04 09:24:26 字數 3014 閱讀 5080

在考慮記憶體管理之前,我們要先知道資源所佔的記憶體大小。博主在這裡整理了一些基礎元素所佔的位元組大小,防止長時間不接觸而遺忘掉。

cout << sizeof(char) << endl;       //1

cout << sizeof(short) << endl; //2

cout << sizeof(int) << endl; //4

cout << sizeof(long) << endl; //4

cout << sizeof(long long) << endl; //8

cout << sizeof(char*) << endl; //32位4個位元組,64位8個位元組

cout << sizeof(float) << endl; //4

cout << sizeof(double) << endl; //8

這裡有小夥伴經常會問乙個問題,為什麼指標在32位的系統佔4個位元組,而在64位系統會佔8個位元組呢?

我們知道cpu是無法直接在硬碟上讀取資料的,而是通過記憶體讀取。cpu通過位址匯流排、資料匯流排、控制匯流排三條線對記憶體中的資料進行傳輸和操作。

我們平時所說的計算機是64位、32位、16位,指的是計算機cpu中通用暫存器一次性處理、傳輸、暫時儲存的資訊的最大長度。簡單的說32位的作業系統就是指:位址匯流排是32位的系統。那麼,也就是說作業系統的位數決定了指標變數所佔的位元組數。

const char *str1 = "my program";

char str2 = "my program";

//char str3[10] = "my program"; //error c2117: 'my program' : array bounds overflow

char str4[100] = "my program";

int str5[100];

char str6 = "abc";

char str7 = "a\n";

char *str8 = (char *)malloc(100);

void *str9 = (void *)malloc(100);

cout << sizeof(str1) << endl; //4 str1是指向字串常量的字元指標,sizeof獲得的是乙個指標所佔的空間

cout << sizeof(str2) << endl; //11

cout << sizeof(str4) << endl; //100

cout << strlen(str1) << endl; //10

cout << strlen(str2) << endl; //10

cout << strlen(str4) << endl; //10

cout << sizeof(str5) << endl; //400

cout << sizeof(str6) << endl; //4

cout << sizeof(str7) << endl; //3

cout << sizeof(str8) << endl; //4

cout << sizeof(str9) << endl; //4

structa;

structb;

structc;

structd;

cout << sizeof(a) << endl; //24

cout << sizeof(b) << endl; //8

cout << sizeof(c) << endl; //16

cout << sizeof(d) << endl; //16

結構體位元組對齊的規則如下:

結構體中元素按照定義順序依次置於記憶體中,但並不是緊密排列。從結構體首位址開始依次將元素放入記憶體時,元素會被放置在其自身對齊大小的整數倍位址上;

如果結構體大小不是所有元素中最大對齊大小的整數倍,則結構體對齊到最大元素對齊大小的整數倍,填充空間放置到結構體末尾;

基本資料型別的對齊大小為其自身的大小,結構體資料型別的對齊大小為其元素中最大對齊大小元素的對齊大小;

例1:

class a {};

class b ;

class c: public a {};

class d: public virtual b {};

class e: public a, public b {};

cout << sizeof(a) << endl; //1

cout << sizeof(b) << endl; //8

cout << sizeof(c) << endl; //1

cout << sizeof(d) << endl; //12

cout << sizeof(e) << endl; //8

例2:

class a ;

class b ;

class c ;

class d ;

cout << sizeof(a) << endl; //4

cout << sizeof(b) << endl; //8

cout << sizeof(c) << endl; //12

cout << sizeof(d) << endl; //32

總結一下計算乙個類物件大小的規律:

空類、單一繼承的空類、多重繼承的空類所佔空間大小為:1個位元組;

乙個類中,虛函式本身、成員函式(包括靜態與非靜態)和靜態資料成員都是不占用類物件的儲存空間的;

當類中宣告了虛函式(不管是1個還是多個),那麼在例項化物件時,編譯器會自動在物件裡安插乙個指標vptr指向虛函式表vtable;

虛承繼的情況:由於涉及到虛基表,會增加乙個vbptr指標指向虛基表vbtable;

在考慮以上內容所佔空間的大小時,還要注意編譯器插入的位元組補齊;

C語言各型別所佔位元組數

1 struct結構體變數大小等於結構體中的各個成員變數所佔記憶體大小總和,union共用體變數大小等於共用體結構中占用記憶體最大的成員的記憶體大小 聯合體中占用記憶體空間最大的字段加上填充位元組 對齊位元組後所需位元組數 2 列舉型別,指乙個被命名的整型常數的集合。即列舉型別,本質上是一組常數的集...

資料型別所佔位元組數

一 32位平台 分為有符號型與無符號型。有符號型 short 在記憶體中佔兩個位元組,範圍為 2 15 2 15 1 int 在記憶體中佔四個位元組,範圍為 2 31 2 31 1 long在記憶體中佔四個位元組,範圍為 2 31 2 31 1 無符號型 最高位不表示符號位 unsigned sho...

C語音中資料型別所佔位元組數

和機器字長及編譯器有關係 所以,int,long int,short int的寬度都可能隨編譯器而異。但有幾條鐵定的原則 ansi iso制訂的 1 sizeof short int sizeof int 2 sizeof int sizeof long int 3 short int至少應為16位...