我有興趣注意C++(VSVC++ 2008特別)讓我在方法中聲明一個內聯結構。 e.g:內聯結構聲明
MyClass::method()
{
struct test{ int x;};
test t = {99};
}
我的問題是,它如何申報工作在內部,具體它有任何負面的性能影響?
我有興趣注意C++(VSVC++ 2008特別)讓我在方法中聲明一個內聯結構。 e.g:內聯結構聲明
MyClass::method()
{
struct test{ int x;};
test t = {99};
}
我的問題是,它如何申報工作在內部,具體它有任何負面的性能影響?
該聲明如何在內部工作?
完全像名稱空間範圍內的聲明,只是名稱只在其聲明的塊的範圍內(在本例中爲函數體)可見。更新:正如@Nawaz指出的,有一個或兩個額外的限制適用於本地類:它們不能有靜態數據成員,並且(在C++ 03中,但不在C++ 11中)它們不能用作模板類型參數。
它是否有任何負面的性能影響?
否,除了它的範圍(隻影響代碼是否編譯)之外,它與任何其他類定義相同。
不完全正確的答案。本地類和名稱空間類有很多不同之處。看到可能的重複:http://stackoverflow.com/questions/5714616/usage-of-local-class-in-c-function – Nawaz
@Nawaz:謝謝,我做了一些簡單的簡化,我其實並不知道他們不能有靜態數據成員。我認爲現在答案更爲正確。 –
如果您認爲函數中的聲明struct
在每次調用後都會產生負面成本,並且需要cpu時間,那麼您是錯誤的。編譯器在編譯時處理它,就像你聲明struct
不在函數中(但範圍有限)。
與在函數作用域內或其外部定義類型的主要區別在於範圍。也就是說,如果它在函數內部定義,它將不能在函數之外訪問。
雖然有其他的不同(至少在C++ 03中,我沒有複習過C++ 11),但你不能在本地類中擁有靜態成員或模板成員。您不能將該本地類用作模板的參數(此限制已在C++ 11中刪除),而IIRC則是因爲本地類具有內部鏈接(而不是外部用於名稱空間級別類),並且需要模板理由是外部聯繫。
[在C++函數中使用本地類]可能的重複(http://stackoverflow.com/questions/5714616/usage-of-local-class-in-c-function) – Nawaz
它被稱爲本地類。更多關於它的[可能的重複](http://stackoverflow.com/questions/5714616/usage-of-local-class-in-c-function)。 – Nawaz