2011-10-11 83 views
6

我有興趣注意C++(VSVC++ 2008特別)讓我在方法中聲明一個內聯結構。 e.g:內聯結構聲明

MyClass::method() 
{ 
struct test{ int x;}; 
test t = {99}; 
} 

我的問題是,它如何申報工作在內部,具體它有任何負面的性能影響?

+0

[在C++函數中使用本地類]可能的重複(http://stackoverflow.com/questions/5714616/usage-of-local-class-in-c-function) – Nawaz

+0

它被稱爲本地類。更多關於它的[可能的重複](http://stackoverflow.com/questions/5714616/usage-of-local-class-in-c-function)。 – Nawaz

回答

6

該聲明如何在內部工作?

完全像名稱空間範圍內的聲明,只是名稱只在其聲明的塊的範圍內(在本例中爲函數體)可見。更新:正如@Nawaz指出的,有一個或兩個額外的限制適用於本地類:它們不能有靜態數據成員,並且(在C++ 03中,但不在C++ 11中)它們不能用作模板類型參數。

它是否有任何負面的性能影響?

否,除了它的範圍(隻影響代碼是否編譯)之外,它與任何其他類定義相同。

+2

不完全正確的答案。本地類和名稱空間類有很多不同之處。看到可能的重複:http://stackoverflow.com/questions/5714616/usage-of-local-class-in-c-function – Nawaz

+0

@Nawaz:謝謝,我做了一些簡單的簡化,我其實並不知道他們不能有靜態數據成員。我認爲現在答案更爲正確。 –

0

如果您認爲函數中的聲明struct在每次調用後都會產生負面成本,並且需要cpu時間,那麼您是錯誤的。編譯器在編譯時處理它,就像你聲明struct不在函數中(但範圍有限)。

2

與在函數作用域內或其外部定義類型的主要區別在於範圍。也就是說,如果它在函數內部定義,它將不能在函數之外訪問。

雖然有其他的不同(至少在C++ 03中,我沒有複習過C++ 11),但你不能在本地類中擁有靜態成員或模板成員。您不能將該本地類用作模板的參數(此限制已在C++ 11中刪除),而IIRC則是因爲本地類具有內部鏈接(而不是外部用於名稱空間級別類),並且需要模板理由是外部聯繫。