如何防止 gcc 优化 C 语言中的一些语句?

为了使页面脏(打开页表条目中的脏位) ,我按下页面的第一个字节,如下所示:

pageptr[0] = pageptr[0];

但在实践中,gcc 将忽略死店淘汰的声明。为了防止 gcc 对它进行优化,我将语句重写如下:

volatile int tmp;
tmp = pageptr[0];
pageptr[0] = tmp;

看来这招奏效了,不过有点难看。我想知道是否有任何指令或语法具有相同的效果?我不想使用 -O0标志,因为它也会带来很大的性能损失。

182288 次浏览

关闭优化可以解决这个问题,但这是不必要的。更安全的替代方法是使用 volatile类型限定符使编译器优化存储区是非法的。

// Assuming pageptr is unsigned char * already...
unsigned char *pageptr = ...;
((unsigned char volatile *)pageptr)[0] = pageptr[0];

volatile类型限定符指示编译器对内存存储和加载要严格。volatile的目的之一是让编译器知道内存访问有副作用,因此必须保留。在这种情况下,存储具有导致页错误的副作用,您希望编译器保留页错误。

这样,周围的代码仍然可以进行优化,并且您的代码可以移植到不理解 GCC 的 #pragma__attribute__语法的其他编译器。

你可以用

#pragma GCC push_options
#pragma GCC optimize ("O0")


your code


#pragma GCC pop_options

禁用自 GCC 4.4以来的优化。

如果需要更多详细信息,请参阅 GCC 文档。

您也可以根据自己的需要使用 __attribute__((optimize("O0"))),而不是使用新的杂注。这样做的好处是只应用于单个函数,而不是同一文件中定义的所有函数。

用法例子:

void __attribute__((optimize("O0"))) foo(unsigned char data) {
// unmodifiable compiler code
}