簡體   English   中英

C++中的變量訪問內聯函數

[英]The variable access Inline function in C++

在內聯函數中,建議編譯器在編譯時將一段代碼復制到調用程序中。

#include<iostream>
inline void swap(int *a, int *b){
    a=a^b;
    b=a^b;
    a=a^b;
}
int main(){
    int a=2,b=3;
        swap(a,b);
    std::cout<<a<<b;
    return 0;
}

在這里,交換函數是按值調用的。 那么,假設上面的代碼是由編譯器內聯的,那么實際變量ab將被傳遞以使其完美運行還是具有內聯函數的部分具有其他范圍?

因為,如果是內聯的,這里的代碼直接復制到main ,並且由於不會發生參數傳遞,因此代碼可以訪問ab

ps:該問題已被編輯,因為我無法准確表達我的懷疑,因此可能會被否決。

為什么第一個代碼在使用指向ab的指針之前無法工作?

因為swap需要指針。 你不能在沒有指針的情況下調用它,即使它會被內聯。 即使語義因優化而發生變化,程序仍然需要在語法上正確。

另請注意, inline只是建議編譯器內聯函數。 如果您在多個翻譯單元中定義函數,它的實際目的是防止多個定義錯誤。

在內聯函數中,編譯時的代碼片段被復制到調用程序中。

那是完全錯誤的。 使函數inline對您的程序執行的操作沒有影響。 如果您的函數在沒有inline情況下不起作用,那么當您將其設置為inline時它就不會開始工作,反之亦然。

所以這個問題的前提是錯誤的。

您的inline函數和用法是錯誤的。 您正在將變量傳遞給需要指針的函數。

main ,您的函數調用應該是:
swap(&a, &b);

如果你不想弄亂指針,我推薦一個使用引用的版本:

#include <iostream>
using std::cout;

inline void my_swap(int& a, int& b)
{
  int temp = a;
  a = b;
  b = a;
}

int main()
{
  int p = 42, q = 1;
  cout << "p: " << p << ", q: " << q << "\n";
  swap(p, q);
  cout << "p: " << p << ", q: " << q << "\n";
  return 0;
}

swap的參數是通過引用傳遞的,這意味着該函數將修改傳遞給swap的變量。

取上面的main函數,打印出匯編語言。 應該沒有對swap函數的分支或調用指令。 根據需要增加優化級別(一些編譯器不會在最低優化級別內聯代碼,以使調試更容易)。 一個非常智能的編譯器可以用匯編語言指令替換整個函數以進行交換。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM