1樓:徐哥聊運營
c++ 語言支援函式內聯,其目的是為了提高函式的執行效率(速度)。
在c程式中,可以用巨集**提高執行效率。巨集**本身不是函式,但使用起來象函式。
預處理器用複製巨集**的方式代替函式呼叫,省去了引數壓棧、生成組合語言的call呼叫、
返回引數、執行return等過程,從而提高了速度。
2樓:匿名使用者
可以除錯,看值!!!!巨集是無法除錯的!
3樓:海金剛俊傑
函式內聯
用內聯取代巨集**
----------------
c++語言支援函式內聯,其目的是為了提高函式的執行效率(速度)。
在c程式中,可以用巨集**提高執行效率。巨集**本身不是函式,但使用起來象函式。
預處理器用複製巨集**的方式代替函式呼叫,省去了引數壓棧、生成組合語言的call呼叫、
返回引數、執行return等過程,從而提高了速度。
使用巨集**最大的缺點是容易出錯,預處理器在複製巨集**時常常產生意想不到的邊際效應。
對於c++
而言,使用巨集**還有另一種缺點:無法操作類的私有資料成員。
讓我們看看c++
的"函式內聯"是如何工作的。
對於任何內聯函式,編譯器在符號表裡放入函式的宣告(包括名字、引數型別、返回值型別)。
如果編譯器沒有發現內聯函式存在錯誤,那麼該函式的**也被放入符號表裡。
在呼叫乙個內聯函式時,編譯器首先檢查呼叫是否正確
(進行型別安全檢查,或者進行自動型別轉換,當然對所有的函式都一樣)。
如果正確,內聯函式的**就會直接替換函式呼叫,於是省去了函式呼叫的開銷。
這個過程與預處理有顯著的不同,因為預處理器不能進行型別安全檢查,或者進行自動型別轉換。
假如內聯函式是成員函式,物件的位址(this)會被放在合適的地方,這也是預處理器辦不到的。
c++語言的函式內聯機制既具備巨集**的效率,又增加了安全性,而且可以自由操作類的資料成員。
所以在c++
程式中,應該用內聯函式取代所有巨集**,"斷言assert"恐怕是唯一的例外。
assert是僅在debug版本起作用的巨集,它用於檢查"不應該"發生的情況。
為了不在程式的debug版本和release版本引起差別,assert不應該產生任何***。
如果assert是函式,由於函式呼叫會引起記憶體、**的變動,那麼將導致debug版本與release版本存在差異。
所以assert不是函式,而是巨集。
在c中,內聯函式和外聯函式的區別是什麼
在類的定義中規定在類體中說明的函式作為類的成員,稱為成員函式。前面講過一般的成員函式,它是根據某種類的功能的需要來定義的。又講述了一些特殊的成員函式 建構函式 析構函式 拷貝初始化建構函式等。還有一些成員函式後面還會介紹。成員函式除了說明和定義在類中之外,還有些什麼特性,這是本節討論的問題。一 內聯...
內聯函式和成員函式的區別是什麼,類體外定義成員函式和 內聯成員函式有什麼區別
黃邦勇帥哥哥 1 內聯函式可減少cpu的系統開銷,並且程式的整體速度將加快,但當內聯函式很大時,會有相反的作用,因此一般比較小的函式才使用內聯函式 2 有兩種內聯函式的宣告方法,一種是在函式前使用inline關見字,另一種是在類的內部定義函式的 這樣的函式將自動轉換為內聯函式,而且沒必要將inlin...
關於C語言函式與陣列的問題
include stdio.h void swap int a,int b,int n c語言函式間引數的傳遞全部是值傳遞,分傳值和傳址兩種 你問的問題跟傳址有關,所謂傳址就是將一塊記憶體的首位址值在函式間進行傳遞,實際上也是傳值,只不過這個值不是你所賦予的值,而是位址值 比如我們定義一維陣列,進行...
c虛函式呼叫,C 虛函式呼叫
虛函式的好處是,你只要有乙個基類的指標,就可以根據情況來執行派生類中的函式。比如你給的程式中,main中只有乙個指標,他是指向基類a的 p 但是你注意這裡,p b p print 這裡將輸出 20 及b.setb 20 的結果。而如果print不是虛函式,這裡將輸出 10,你可以自己試試 也就是說,...
c 函式名 縮寫,C 函式名 縮寫
stdio librany 標準函式庫的意思。第二個不清楚 exp是冪的意思 standard library ldexp 是乙個 math.h 裡面的乙個函式,double ldexp double x,int exp 功能 用來將引數x乘上2的exp次方值,即x 2exp。std就是標準的英文縮...