c語言中主要的關鍵字總結
register:
定義變量是寄存器保存,不寫到內存上
- 因為在寄存器上,所以不能取地址
- 不能保存存放在data和bss段的數據
- 寄存器相當於內存的高速緩存,增加訪問速度,但具體能夠保存多少個由cpu決定,多余的將被忽略。
static:
static修飾變量:
- static修飾局部變量,第一次遇到時初始化,並將數據存放在data段,所以函數棧針回退時並不會銷毀,在程序結束後銷毀。
- static修飾全局變量:與全局變量不同的是,其他文件在鏈接時不能找到此變量符號的地址。
- c++中,全局變量影響封裝,使用類內定義的靜態數據成員,通過作用域訪問來實現,所以不與全局變量重名(一般在類內定義,類外初始化)。
- c++中static修飾的數據成員不能再構造函數初始化,需要在定義時初始化。只有靜態常整形變量能在類內初始化(static const int)。
static修飾函數:
- c語言中函數加static聲明此函數在鏈接時不可被找到地址,只限本文件可見。
- c++中,static修飾的函數沒有this指針傳入,所以不能訪問對象非static數據成員。
NULL:
在c語言中 #define NULL (void*)0,所以對於指針來說p == NULL 和 p == 0 是一個道理。c++中 #define NULL 0 ,而對於函數的重載又會出現問題,所以引入了新的nullptr,使用類模板的作用於來區分不同類型的
switch和case:
- 註意記得break
- 浮點數不精確
- switch相比if else更高效,原因是查看反匯編發現使用寄存器保存值直接去比較然後跳轉,而if else每次都需要運算表達式的值再跳轉。
const:
c語言中 const 為常變量 不能作為左值
c++中const 為常量 必須初始化 符號為local 加 extern變global
編譯過程中常量名字替換成常量的初值
編譯器要保證const修飾的量不能被直接或者間接修改掉(試圖把常量的地址賦值給普通指針)
如果初始值為變量則退化成常變量
const & 引用常量(可尋址的常量和不可尋址的常量)
const右邊沒有任何指針的話不參與類型,引用不參與類型
volatile:
在多線程程序中使變量不會被緩存 保證了數據的可見性 不保證原子性
1.防止編譯器對匯編指令進行順序上的優化
- 編譯器對指令順序的調優 volatile
- 程序運行時CPU對指令順序的調優 barrier()
2.防止寄存器存儲變量的副本值
struct和class區別:
1.strcut和class中都可以定義變量函數實現多態繼承
2.struct更偏向於定義數據類型,class偏向於定義對象和方法
3.class繼承默認private,struct繼承默認public
4.class可以使用模板,struct不行
對於空struct和class因為定義不同的結構體(對象)要區分,最少要分配一字節來存儲他,而且要註意內存對齊。
大端小端的判斷方法:
- 通過聯合體判斷
- printf判斷
- 取地址強轉後解引用
malloc,realloc,calloc
malloc從堆申請一塊內存(超過mmap閾值調用匿名映射)。
calloc 可以在分配後初始化。
realloc 擴容到新的大小,可能出現的問題:1.函數容易產生歧義,造成內存泄漏 2.realloc可能會移動位置,c++中對象引用外部資源可能造成內存泄漏。
c語言中主要的關鍵字總結