[英]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.