9.2. GCC优化问题

为了让一个页变成脏页(页表中dirty位被置上),需要执行下面这段代码:

1 uint32_t *page; 

2 // ... 

3 page[0] = page[0]; 

最后一行代码很有可能被gcc优化掉,因为这段代码看起来没有任何实际的作用。那么如何防止gcc对这段代码做优化呢?

设置gcc编译时优化级别为-O0肯定是不合适的,这样对程序性能影响会比较大。
一个强制类型转换的方案:

1 ((unsigned char volatile *)page)[0] = page[0]; 

通过volatile关键字禁止gcc的优化,和我之前采用的方法类似。

另外可以使用编译器指令#pragma指定那块代码的特殊处理
1 #pragma GCC push_options 

2 #pragma GCC optimize ("O0") 

3   

4 your code 

5   

6 #pragma GCC pop_options 

这里用到了gcc 4.4的特性Function Specific Option Pragmas,在特定代码前保存当前的编译选项,然后对特定的代码使用O0优化级别,最后再恢复之前保存的编译选项。