1.宏定義
- 用宏定義去求一個(gè)結(jié)構(gòu)體struct里某個(gè)變量相對(duì)struct的偏移量里初。要求偏移量首先struct a; return ((&a)->e) - (&a); 以下的宏是強(qiáng)制轉(zhuǎn)換0為a的地址啃勉。或者說(shuō)struct *p; p = &a;這樣比較好理解双妨,把0強(qiáng)制轉(zhuǎn)換成了(struct *)的類型淮阐。
#define FIND(struc, e) (size_t)&((struct*)0->e)
- 用宏去定義常量
#define SECONDS_PER_YEAR ( 60 * 60 * 24 * 365)UL
- 宏描述函數(shù):之所以全部都要用括號(hào)括起來(lái)因?yàn)閐efine是直接復(fù)制過(guò)去的
#define MIN(A,B) ((A)<=(B) ? (A) : (B))
2.const
- const和define定義的常量有什么區(qū)別:
const常量有數(shù)據(jù)類型,而宏通常沒(méi)有刁品,編譯器對(duì)前者可以進(jìn)行類型安全檢查枝嘶,對(duì)后者只進(jìn)行字符替換,可能發(fā)生意料不到的錯(cuò)誤哑诊。
調(diào)試工具不能對(duì)宏常量進(jìn)行調(diào)試群扶。
const可以指定常量的作用域,比如在指定類里面的class專屬常量镀裤,const成員常量是可以被封裝的竞阐,而宏定義做不到這一點(diǎn)。
const可以說(shuō)明到底是指針還是被指物為常量暑劝。
- 在設(shè)計(jì)類的時(shí)候骆莹,一個(gè)原則就是對(duì)于不改變數(shù)據(jù)成員的成員函數(shù)都要在后面加 const,而對(duì)于改變數(shù)據(jù)成員的成員函數(shù)不能加 const担猛。
如果要改變的話幕垦,只需要加上 mutable修飾成員變量名
3.sizeof
- 指針的大小是4字節(jié),而不論他指向的是什么傅联。
char *sc = "0123456789";
int *sp = (int *)malloc(100);
- 字符數(shù)組用常量字符串賦值的時(shí)候末尾會(huì)自動(dòng)帶上\0.
- float是4字節(jié)先改,double是8字節(jié),int是4字節(jié)
char是1字節(jié)蒸走,string默認(rèn)是32字節(jié) - 結(jié)構(gòu)體的sizeof時(shí)要進(jìn)行內(nèi)存對(duì)齊仇奶,通常以結(jié)構(gòu)體內(nèi)存在長(zhǎng)度最長(zhǎng)的數(shù)據(jù)元素為對(duì)齊單位,如以下sizeof(B)為8字節(jié)比驻。
struct{
long int b1;//4字節(jié)
short int a2; //2字節(jié)
}B
-
對(duì)齊方式的問(wèn)題该溯,比如同樣是4字節(jié)對(duì)齊。變量聲明的順序别惦,即分配內(nèi)存的順序也跟對(duì)齊有關(guān)
1.png
后者先定義int后定義兩個(gè)bool狈茉,注意bool只占1字節(jié)。
2.png 靜態(tài)變量存在全局?jǐn)?shù)據(jù)區(qū)而不是棧中掸掸,sizeof只求棧里的大小氯庆。
sizeof和strlen的區(qū)別
sizeof的結(jié)果類型是 size_t(typedef 為 uint類型)
sizeof是運(yùn)算符,strlen是函數(shù)
sizeof可以用類型做參數(shù),strlen只能用char* 做參數(shù)点晴,且必須以\0結(jié)尾感凤。sizeof還可以用函數(shù)做參數(shù)(去求返回值的類型大小)粒督。
數(shù)組做sizeof的參數(shù)不退化陪竿,而傳遞給strlen就退化為指針。
編譯時(shí)sizeof就計(jì)算了屠橄,所以sizeof(x)可以用來(lái)定義數(shù)組維數(shù)族跛,而strlen的結(jié)果要在運(yùn)行時(shí)才能計(jì)算出來(lái)徙缴,用來(lái)計(jì)算字符串的長(zhǎng)度呻惕,而不是類型占內(nèi)存的大小。
4.內(nèi)聯(lián)函數(shù)和宏定義
內(nèi)兩函數(shù)是指嵌入代碼铜涉,就是在調(diào)用函數(shù)的地方不是跳轉(zhuǎn)溪北,而是把代碼直接寫(xiě)到那里去桐绒。如果一個(gè)函數(shù)不斷被重復(fù)調(diào)用,而且函數(shù)只有簡(jiǎn)單的幾行之拨,且函數(shù)內(nèi)不包含for茉继,while,switch語(yǔ)句蚀乔,可以考慮用inline函數(shù)烁竭。
宏是在代碼出不加任何驗(yàn)證的簡(jiǎn)單替換,除非迫不得已絕不應(yīng)該使用吉挣。