也談內聯函式

2021-05-24 05:28:08 字數 1391 閱讀 2469

內聯函式使用的 三個關鍵字為:

inline ,__inline ,__forceinline

在下面情況下編譯器不使用內聯編譯:

1 函式或者呼叫者用選項/ob0 編譯的(debug builds 預設選項)

2 函式或者呼叫者使用不同的異常處理型別(c++使用一種異常處理,結構化使用一種異常處理)

3 函式有可變的引數列表

4 函式使用內嵌彙編並且沒有使用選項 /og,/ox,/o1,or /o2 中的一種編譯。

5 函式返回乙個unwindable object 並且沒有使用選項/gx, /ehs, or /eha編譯。

unwindable object: 乙個本地物件,被分配在棧空間的,當超過了生存範圍需要被釋放的自動儲存類的例項。

6 函式收到用乙個拷貝構造物件作為值,並且沒有使用選項/gx, /ehs, or /eha 編譯。

7 函式是遞迴的並且沒有結合 #pragma(inline_recursion, on)。在 pragma 遞迴函式能被內聯到預設的8層呼叫深度。對於修改內聯

深度,使用 #pragma(inline_depth, n).

在 除錯版本中一般看不到內聯編譯的。

如下**:

inline int max( int a , int b )

呼叫__asm int 3;

int a = max(100,20);

004010f3 push 14h

004010f5 push 64h

004010f7 call @ilt+15(max) (00401014)

004010fc add esp,8

004010ff mov dword ptr [ebp-0ch],eax

在 release 版本 中如果用除錯資訊的話也是看不到內聯編譯的。

在 release 版本 中最終發布版本中可以看到已經內聯編譯了。

在其中嵌入 __asm int 3 可以除錯情況下看到:

0040102a int 3

0040102b mov eax,64h // eax = 100

00401030 cmp eax,14h // 比較 100>20?

00401033 jle 0040103e //if > then to 0040103e

00401035 mov dword ptr [ebp-4],64h // 賦值

0040103c jmp 00401045

0040103e mov dword ptr [ebp-4],14h

內聯函式的好處是:

1 減小棧空間大小

2 用暫存器代替了記憶體,提高了程式的速度

壞處:1 增加了編譯後的**長度

2 不能使用棧回溯方式除錯,增加除錯難度

也談分析函式over

as we know oracle從8.1.6開始提供分析函式,分析函式用於計算基於組的某種聚合值,它和聚合函式的不同之處是對於每個組返回多行,而聚合函式對於每個組只返回一行。快哭了。來看看區別 1.先建立示例表 create table empas select from scott.emp al...

也談memset函式的使用

memset 函式很多地方有介紹,多餘的就不說了。這裡給出msdn 上的一段解釋 sets buffers to a specified character.void memset void dest,int c,size t count wchar t wmemset wchar t dest,w...

也談武媚娘

前段時間電視熱播 武媚娘 老婆天天晚上看。我不大喜歡看各種誇張和粉飾的歷史劇,但是對歷史還是喜歡一些,所以就利用閒餘的時間搜尋一下,看看唐朝的那些事。正好把自己的搜尋和感慨整理記錄下。唐朝是乙個中國發展的乙個鼎盛時期,即便如此,也是乙個多事的朝代。李世民宣武門弒兄,自己逼迫父親成為了太上皇,兒子李志...