3 回答
TA貢獻1799條經驗 獲得超8個贊
在匿名命名空間中有一些東西意味著它是本翻譯單元的本地(.cpp文件及其所有包含)這意味著如果在別處定義了具有相同名稱的另一個符號,則不會違反一個定義規則(ODR)。
這與具有靜態全局變量或靜態函數的C方式相同,但它也可以用于類定義(并且應該使用而不是static在C ++中使用)。
同一文件中的所有匿名命名空間都被視為相同的命名空間,不同文件中的所有匿名命名空間都是不同的。匿名命名空間相當于:
namespace __unique_compiler_generated_identifer0x42 {
...
}
using namespace __unique_compiler_generated_identifer0x42;
TA貢獻1946條經驗 獲得超3個贊
除了這個問題的其他答案之外,使用匿名命名空間還可以提高性能。由于命名空間中的符號不需要任何外部鏈接,因此編譯器可以更自由地對命名空間內的代碼執行積極的優化。例如,可以內聯在循環中多次調用一次的函數,而不會對代碼大小產生任何影響。
例如,在我的系統上,如果使用匿名命名空間,則以下代碼占用大約70%的運行時間(x86-64 gcc-4.6.3和-O2;請注意,add_val中的額外代碼使編譯器不想包含它兩次)。
#include <iostream>
namespace {
double a;
void b(double x)
{
a -= x;
}
void add_val(double x)
{
a += x;
if(x==0.01) b(0);
if(x==0.02) b(0.6);
if(x==0.03) b(-0.1);
if(x==0.04) b(0.4);
}
}
int main()
{
a = 0;
for(int i=0; i<1000000000; ++i)
{
add_val(i*1e-10);
}
std::cout << a << '\n';
return 0;
}
- 3 回答
- 0 關注
- 872 瀏覽
添加回答
舉報
