記憶體對齊三原則:
第乙個資料從0開始,以後每個資料要從他本身大小的整數倍開始存;
如果這個資料是個結構體或者陣列,則從其最大元素的整數倍開始存;
最後收尾要是最大成員的整數倍,不足補齊;
對齊方式(變數存放的起始位址相對於結構的起始位址的偏移量)
char
偏移量必須為sizeof(char)即1的倍數
int
偏移量必須為sizeof(int)即4的倍數
float
偏移量必須為sizeof(float)即4的倍數
double
偏移量必須為sizeof(double)即8的倍數
short
偏移量必須為sizeof(short)即2的倍數
typedef
struct bb
bb;typedef
struct aa
aa;
sizeof結果分別是24和48
加入#pragma pack
加上#pragma pack(n)後,對齊時就選擇n和資料大小兩者中最小的那個作為對齊的規則,條件三也不需要了。
sizeof與strlen的區別
int h = sizeof("abcde");
int t = strlen("abcde");
其中,h為6,t為5.
sizeof計算字串與指標
string s = "hellohwc";
char * s1 = "hellohwc";
char s2 = "hellohwc";
char s3[100];
char* s4=(char*)malloc(100);
void *s5=(void*)malloc(100);
cout
<<<<<<0;
輸出:32(?)、4、9、100、4、4
sizeof計算類
#include "stdafx.h"
#include
#include
using namespace std;
class emptyclass1
~emptyclass1(){}
};
class emptyclass2
virtual ~emptyclass2(){}
};
class hwcbase
virtual ~hwcbase(){}
private:
intbase;
};
class hwcsubfirst:hwcbase
~hwcsubfirst(){}
private:
int sub;
};
class hwcsubsecond:hwcbase
~hwcsubsecond(){}
private:
int sub;
char sub2;
};
int _tmain(int argc, _tchar* argv)
輸出:1、4、8、12、16
sizeof中的表示式不會被計算
int i;
i = 10;
printf("%d\n", i);
printf("%d\n", sizeof(i++));
printf("%d\n", i);
輸出結果為10,4,10 記憶體中的資料對齊與sizeof函式
之所以會有資料對齊是因為訪問記憶體的硬體電路特性。位址匯流排按對齊位址訪問,以4自己對齊為例。如果想得到0x00000001開始的4個位元組內容,系統需要以0x00000000開始讀4個位元組,取後面3個,再以0x00000004開始讀4個位元組取第乙個,組合得到想要的4個位元組。這樣取數的速度就會...
位元組對齊與sizeof
本文主要包括二個部分,第一部分重點介紹在vc中,怎麼樣採用sizeof來求結構的大小,以及容易出現的問題,並給出解決問題的方法,第二部分總結出vc中sizeof的主要用法。1 sizeof應用在結構上的情況 請看下面的結構 struct mystruct 對結構mystruct採用sizeof會出現...
sizeof 與 位元組對齊
sizeof是運算子,可用於任何變數名 型別名或常量值,當用於變數名 不是陣列名 或常量時,它不需要用圓括號。它在編譯時起作用,而不是執行時。這是初學者問得最多的乙個問題,所以這裡有必要多費點筆墨。讓我們先看乙個結構體 struct s1 問sizeof s1 等於多少聰明的你開始思考了,char佔...