簡體   English   中英

C ++中內聯函數的編譯器優化

[英]Compiler optimizations of inlined functions in C++

當內聯使用在參數中使用指針的函數時,編譯器是否在優化過程中刪除了間接尋址? 當然,這是有道理的。

這是一個明顯的例子:

inline void say_hello (person* p) {
    std::cout << "hello " << p->name << std::endl;
}

int main () {
    person goldorak;
    goldorak.name = "Goldorak";

    say_hello(&goldorak);
    return 0;
}

這種情況是微不足道的,但是如果編譯器進行了優化,那么在某些情況下它不會呢?

好處 :我在哪里可以獲得編譯器進行的一些“基本”優化的列表?

附:我只是很好奇

我假設使用的是GCC,因此您要查找的鏈接是http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html

並引用:(這可能不是您得到的)

-findirect-inlining由於以前的內聯,Inline也可以發現在編譯時已知的間接調用。 僅當通過-finline-functions或-finline-small-functions選項打開內聯自身時,此選項才有效。

 Enabled at level -O2. 

Visual Studio編譯器(包括C ++)的等效文檔http://msdn.microsoft.com/zh-cn/library/k1ack8f1.aspx (您可以單擊鏈接獲取更多信息)

一個好的編譯器可以做到這一點。 但是,這將是一個分為兩個階段的過程。 首先,它將內聯函數。 然后,下一個階段可以意識到該結構的唯一用途是暫時保留name並消除它。

是的,以我的經驗,這對於指針(C和C ++)和引用(當然也僅是C ++)都是正確的-幾乎任何體面的編譯器都會優化冗余的間接尋址。 甚至Visual Studio也會這樣做。

暫無
暫無

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

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