對C++中mutable、inline、volatile關鍵字的理解

1、mutable:修飾的變量永遠處於可變狀態。當一個成員函數的功能不包括改變對象的狀態時,將其定義爲一個const成員函數,這個函數是不能修改類的成員數據的,這樣是爲了數據安全,但是有時我們需要在這個函數內修改一些與對象狀態無關的成員變量,這時就可以將那些成員變量用mutable聲明。

2、inline:用於聲明內聯函數。一般函數調用時要將程序的執行權轉給被調用的函數,然後在返回到調用它的函數,而內聯函數在調用時直接在調用處用被調用函數的代碼替換調用表達式。這樣是爲了提高函數調用效率。
①內聯函數的作用相當於表達式形式的宏定義,但是比宏定義更安全好用。
②在類裏面聲明並定義的函數自動轉化爲內聯函數,在類裏聲明,類外定義的函數要加inline關鍵字才能轉化爲內聯函數。
③inline關鍵字只是給編譯器的一個建議,當函數代碼太多時這個建議有可能被拒絕。
④內聯函數的定義要放在.h文件中,讓編譯器看到,也可以只在.h文件中聲明而把定義放到.cpp文件中,這時需要在.h文件末尾#include "filename.cpp"

3、volatile:修飾易變的變量。對一個存儲在內存中的變量,它除了可能會被代碼修改以外,還可能會被編譯器未知的因素修改,比如操作系統、硬件或其他線程。這樣的變量應該聲明爲volatile。
①編譯器會對非volatile變量的訪問代碼進行如下優化:當一段代碼中出現了兩次對這個變量的訪問,且這兩次訪問語句之間的代碼沒有修改這個變量,那麼編譯器會將第一次訪問時取到寄存器中的變量值賦值給第二次訪問語句。
②但是如果這個變量有可能被操作系統、硬件、其他線程更改,那麼這樣的優化勢必會造成第二次訪問到的值不正確,如果用volatile聲明這個變量,編譯器就不會進行這個優化,每次訪問這個變量都會從內存中取這個變量的值。
③const變量可以是volatile變量,因爲const只是規定代碼不能修改這個變量,但是其他因素可以修改。指向緩衝區的指針也可以是volatile變量,因爲中斷服務程序可能會修改這個變量。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章