1. 程式人生 > >c語言中主要的關鍵字總結

c語言中主要的關鍵字總結

尋址 oba 試圖 ++ 定義 運行 cut 回退 反匯編

register:

定義變量是寄存器保存,不寫到內存上

  1. 因為在寄存器上,所以不能取地址
  2. 不能保存存放在databss段的數據
  3. 寄存器相當於內存的高速緩存,增加訪問速度,但具體能夠保存多少個由cpu決定,多余的將被忽略。

static

static修飾變量:

  1. static修飾局部變量,第一次遇到時初始化,並將數據存放在data段,所以函數棧針回退時並不會銷毀,在程序結束後銷毀。
  2. static修飾全局變量:與全局變量不同的是,其他文件在鏈接時不能找到此變量符號的地址。
  3. c++中,全局變量影響封裝,使用類內定義的靜態數據成員,通過作用域訪問來實現,所以不與全局變量重名(一般在類內定義,類外初始化)。
  4. c++static修飾的數據成員不能再構造函數初始化,需要在定義時初始化。只有靜態常整形變量能在類內初始化(static const int)。

static修飾函數:

  1. c語言中函數加static聲明此函數在鏈接時不可被找到地址,只限本文件可見。
  2. c++中,static修飾的函數沒有this指針傳入,所以不能訪問對象非static數據成員。

NULL

c語言中 #define NULL void*0,所以對於指針來說p == NULL p == 0 是一個道理。c++#define NULL 0 ,而對於函數的重載又會出現問題,所以引入了新的nullptr,使用類模板的作用於來區分不同類型的

NULL

switchcase

  1. 註意記得break
  2. 浮點數不精確
  3. switch相比if else更高效,原因是查看反匯編發現使用寄存器保存值直接去比較然後跳轉,而if else每次都需要運算表達式的值再跳轉。

const

c語言中 const 為常變量 不能作為左值

c++const 為常量 必須初始化 符號為local externglobal

編譯過程中常量名字替換成常量的初值

編譯器要保證const修飾的量不能被直接或者間接修改掉(試圖把常量的地址賦值給普通指針)

如果初始值為變量則退化成常變量

const & 引用常量(可尋址的常量和不可尋址的常量)

const右邊沒有任何指針的話不參與類型,引用不參與類型

volatile

在多線程程序中使變量不會被緩存 保證了數據的可見性 不保證原子性

1.防止編譯器對匯編指令進行順序上的優化

  1. 編譯器對指令順序的調優 volatile
  2. 程序運行時CPU對指令順序的調優 barrier()

2.防止寄存器存儲變量的副本值

structclass區別:

1.strcutclass中都可以定義變量函數實現多態繼承

2.struct更偏向於定義數據類型,class偏向於定義對象和方法

3.class繼承默認privatestruct繼承默認public

4.class可以使用模板,struct不行

對於空structclass因為定義不同的結構體(對象)要區分,最少要分配一字節來存儲他,而且要註意內存對齊。

大端小端的判斷方法:

  1. 通過聯合體判斷
  2. printf判斷
  3. 取地址強轉後解引用

mallocrealloccalloc

malloc從堆申請一塊內存(超過mmap閾值調用匿名映射)。

calloc 可以在分配後初始化。

realloc 擴容到新的大小,可能出現的問題:1.函數容易產生歧義,造成內存泄漏 2.realloc可能會移動位置,c++中對象引用外部資源可能造成內存泄漏。

c語言中主要的關鍵字總結