亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C語言中的內聯函數(inline)與宏定義(#define)詳細解析

 更新時間:2013年09月22日 09:18:57   作者:  
內聯函數與宏本質上是兩個不同的概念如果程序編寫者對于既要求快速,又要求可讀的情況下,則應該將函數冠以inline
先簡明扼要,說下關鍵:
1、
內聯函數在可讀性方面與函數是相同的,而在編譯時是將函數直接嵌入調用程序的主體,省去了調用/返回指令,這樣在運行時速度更快。

2、內聯函數可以調試,而宏定義是不可以調試的。
內聯函數與宏本質上是兩個不同的概念如果程序編寫者對于既要求快速,又要求可讀的情況下,則應該將函數冠以inline。下面詳細介紹一下探討一下內聯函數與宏定義。

一、內聯函數是什么?
內聯函數是代碼被插入到調用者代碼處的函數。如同 #define 宏(但并不等同,原因見下文),內聯函數通過避免被調用的開銷來提高執(zhí)行效率,尤其是它能夠通過調用(“過程化集成”)被編譯器優(yōu)化。

二、 內聯函數是如何在安全和速度上取得折衷?
在 C 中,你可以通過在結構中設置一個 void* 來得到“封裝的結構”,在這種情況下,指向實際數據的 void* 指針對于結構的用戶來說是未知的。因此結構的用戶不知道如何解釋void*指針所指內容,但是存取函數可以將 void* 轉換成適當的隱含類型。這樣給出了封裝的一種形式。

不幸的是這樣做喪失了類型安全,并且也將繁瑣的對結構中的每個域的訪問強加于函數調用。(如果你允許直接存取結構的域,那么對任何能直接存取的人來說,了解如何解釋 void* 指針所指內容就是必要的了;這樣將使改變底層數據結構變的困難)。

雖然函數調用開銷是很小的,但它會被累積。C++類允許函數調用以內聯展開。這樣讓你在得到封裝的安全性時,同時得到直接存取的速度。此外,內聯函數的參數類型由編譯器檢查,這是對 C 的 #define 宏的一個改進。

 
三、為什么我應該用內聯函數?而不是原來清晰的 #define 宏? 
因為#define宏定義函數是在四處是有害的:
和 #define 宏不同的是,內聯函數總是對參數只精確地進行一次求值,從而避免了那聲名狼藉的宏錯誤。換句話說,調用內聯函數和調用正規(guī)函數是等價的,差別僅僅是更快:
復制代碼 代碼如下:

// 返回 i 的絕對值的宏
#define unsafe(i) \
         ( (i) >= 0 ? (i) : -(i) )

// 返回 i 的絕對值的內聯函數
inline
int safe(int i)
{
   return i >= 0 ? i : -i;
}

int f();

void userCode(int x)
{
   int ans;

   ans = unsafe(x++);   // 錯誤!x 被增加兩次
   ans = unsafe(f());   // 危險!f()被調用兩次

   ans = safe(x++);     // 正確! x 被增加一次
   ans = safe(f());     // 正確! f() 被調用一次
}

和宏不同的,還有內聯函數的參數類型被檢查,并且被正確地進行必要的轉換。宏定義復雜函數是有害的;非萬不得已不要用。

四、如何告訴編譯器使非成員函數成為內聯函數?
聲明內聯函數看上去和普通函數非常相似:
void f(int i, char c);
當你定義一個內聯函數時,在函數定義前加上 inline 關鍵字,并且將定義放入頭文件:inlinevoid f(int i, char c){   // ...}
注意:將函數的定義({...}之間的部分)放在頭文件中是強制的,除非該函數僅僅被單個 .cpp 文件使用。尤其是,如果你將內聯函數的定義放在 .cpp 文件中并且在其他 .cpp文件中調用它,連接器將給出 “unresolved external” 錯誤。

五、如何告訴編譯器使一個成員函數成為內聯函數?
聲明內聯成員函數看上去和普通函數非常類似:
class Fred {public:  
void f(int i, char c);};
但是當你定義內聯成員函數時,在成員函數定義前加上 inline 關鍵字,并且將定義放入頭文件中:inlinevoid Fred::f(int i, char c){   // ...}通常將函數的定義({...}之間的部分)放在頭文件中是強制的。如果你將內聯函數的定義放在 .cpp 文件中并且在其他 .cpp 文件中調用它,連接器將給出“unresolved external”錯誤。

六、 有其它方法告訴編譯器使成員函數成為內聯嗎?
有:在類體內定義成員函數:class Fred {public:   void f(int i, char c)     {       // ...     }};盡管這對于寫類的人來說很容易,但由于它將類是“什么”(what)和類“如何”(how)工作混在一起.小結總之,在嵌入式C(或C++)編程里面,懂得使用內聯函數(inline)與宏定義(#define),并使用好它們,對我們是大有裨益的。(注:本文部分內容來源于網絡整理,上述探討屬于個人意見,僅供參考。錯誤之處也是難免!)

相關文章

  • C++實現當前時間動態(tài)顯示的方法

    C++實現當前時間動態(tài)顯示的方法

    這篇文章主要介紹了C++實現當前時間動態(tài)顯示的方法,涉及C++時間操作及Sleep方法的使用,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-07-07
  • C++ 學習之旅 Windows程序內部運行原理

    C++ 學習之旅 Windows程序內部運行原理

    學習C++與.net不同的是,一定要搞清楚Windows程序內部運行原理,因為他所涉及大多數是操作系統的調用,而.net畢竟是在.netFrameWork上唱戲
    2012-11-11
  • Qt 使用 canon edsdk 實現實時預覽的示例代碼

    Qt 使用 canon edsdk 實現實時預覽的示例代碼

    這篇文章主要介紹了Qt 使用 canon edsdk 實現實時預覽的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-11-11
  • C語言實現2048游戲

    C語言實現2048游戲

    這篇文章主要為大家詳細介紹了C語言實現2048小游戲,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • 深入理解結構體中占位符的用法

    深入理解結構體中占位符的用法

    本篇文章是對結構體中占位符的用法進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • 深入淺出理解C語言初識結構體

    深入淺出理解C語言初識結構體

    C?數組允許定義可存儲相同類型數據項的變量,結構是?C?編程中另一種用戶自定義的可用的數據類型,它允許你存儲不同類型的數據項,本篇讓我們來了解C?的結構體
    2022-02-02
  • C語言中組成不重復的三位數問題

    C語言中組成不重復的三位數問題

    這篇文章主要介紹了C語言中組成不重復的三位數問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • C++中對象的常引用、動態(tài)建立和釋放相關知識講解

    C++中對象的常引用、動態(tài)建立和釋放相關知識講解

    這篇文章主要介紹了C++中對象的常引用、動態(tài)建立和釋放相關知識講解,是C++入門學習中的基礎知識,需要的朋友可以參考下
    2015-09-09
  • C++中 靜態(tài)局部變量實例詳解

    C++中 靜態(tài)局部變量實例詳解

    這篇文章主要介紹了C++中 靜態(tài)局部變量實例詳解的相關資料,需要的朋友可以參考下
    2017-03-03
  • C語言基于EasyX庫實現有圖形界面時鐘

    C語言基于EasyX庫實現有圖形界面時鐘

    這篇文章主要為大家詳細介紹了C語言基于EasyX庫實現有圖形界面時鐘,獲得本地時間,輸出文字,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03

最新評論