改變這裏有一個簡單的代碼告訴GCC優化該值在全局函數
void GlobalAlterA(A *a) { a->m = 1; }
struct A { int n, int m; };
struct Z: public A { void AlterA() { GlobalAlterA(this); } };
struct Y: public Z {};
struct X: public Y
{
int AsValue()
{
switch (n)
{
case 0: return m;
default: AlterA(); return m;
}
}
};
現在,有了這個代碼的問題是GCC優化扔掉所有AsValue()的代碼,除了「迴歸M」,因爲,我想,它沒有看到GlobalAlterA()主體,也不知道AlterA()可以更改「m」成員。
有沒有辦法解決這個問題,除了關閉特定部分代碼的優化?例如。像易失性說明符等技巧。
您使用的是哪個版本的gcc?在修改代碼以便編譯之後,它會生成我期望的值(「沒有顯式優化」和「-O3」)。也許你可以向我們展示如何使用上面的代碼。 – 2013-04-23 14:19:03
您能否發佈完整的問題演示?如果編譯器影響程序的行爲,編譯器當然不應該刪除對「AlterA」的調用。 – 2013-04-23 14:19:29
我剛剛用-O3編譯了這個,使用gcc 4.7.2彙編語言,並在x86_64上查看它,它看起來不像你說的那樣。我在開始時添加了代碼「std :: cin >> x.n >> x.m」來設置n和m的值,並且修正了一些編譯的東西,比如在定義之前使用類型A,並且根本不能重現。 – jcoder 2013-04-23 14:20:00