簡體   English   中英

編譯器優化問題

[英]Compiler optimization issue

編譯以下內容會導致T::f()得到優化,而沒有任何警告或錯誤:

#include <iostream>

struct T
{
    int t;
    void f(); //undefined..
};

int main()
{
    T t;
    t.t = 1;
    //t.f(); //<-- compiler-error only when used, otherwise optimized-out
    std::cout << t.t;
    return 0;
}

背景:我在類中的函數中使用了存根聲明,以便稍后定義和使用它們。 “后來”再也沒有出現,我的代碼已編譯,並且編譯器未發出有關這些存根的警告或錯誤。

這是編譯器所期望的嗎? 編譯器至少不應發出警告嗎?

這不是“優化”。 C ++編譯器允許您聲明所需的任何內容,前提是該聲明在語法上有效,並且不引用未定義的類型。 這並非特定於成員函數:可以在不提供相應定義的情況下聲明非成員函數和全局變量。

事實證明,無論是編譯器還是鏈接器都沒有資格抱怨未完成的聲明。 由於可能會單獨進行編譯,因此即使發出警告也會造成問題。

編譯器不會抱怨,因為它知道可以由另一個cpp文件提供定義,並且到鏈接器運行時,聲明就消失了:鏈接器可以使用定義和引用,而聲明用於編譯器。

來自評論:

系統.h文件中有數百個(甚至數千個)“應用未調用”功能。 編譯器不知道代碼在哪里:在您的.cpp源代碼中,還是在預編譯的.obj / .o中,或者在.dll / .so等中。 這是鏈接器的職責,而不是編譯器的職責。 因此,編譯器無提示地忽略了沒有“ body”的每個簽名。 – user4419802

編譯器沒有優化任何東西,因為最初沒有任何東西可以優化。 當您宣布void T::f(); 如果願意,您所做的只是在編譯器的內部字典中添加方法簽名。 您從未為該方法指定相應的主體,也從未對其進行調用,因此它只是“從未發生”。

編譯器不知道是否要在另一個編譯單元中聲明T::f() ,它也不在乎,因為它“知道”,如果不聲明,則會出現鏈接器錯誤。

暫無
暫無

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

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