2009年8月11日 星期二

聰明過頭的編譯器

作個小實驗來看看我們所使用的編譯器有多聰明,看了實驗結果後也該小心在意,別因為編譯器太過聰明,聰明反被聰明誤,壞了事。

工具:MS VS.NET C++ 2003
平台:MS Windows XP SP2
void Foo()
{
int a = 0;
if (10 == a)
a = 1;
}

void Bar()
{
int a = 0;
if (10 == a)
a = 1;
}

int main()
{
cout << "&Foo = " << &Foo << "\n";
cout << "&Bar = " << &Bar << "\n";
}
以上很簡單的一小段程式碼。

Debug版本的執行結果如下。

&Foo = 0041B5A0
&Bar = 0041BFA0

而Release版本的執行結果如下。

&Foo = 00401130
&Bar = 00401130

顯然Release版時,Foo及Bar這二個函式被當作同一個函式,因為二者實作內容完全相同(或最佳化後相同),只有名稱不同。雖然這個情況很少見,但看到這樣的結果,還是要小心謹慎,以免不小心寫出莫名其妙不知問題在那裡的程式來。

;

同樣的程式在VS.NET 2005及2008上測試結果也是會發生同樣的問題。

沒有留言:

張貼留言

Related Posts Plugin for WordPress, Blogger...