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

为了使页面变脏(切换页表项中的脏位),我触摸页面的第一个字节,如下所示:

pageptr[0] = pageptr[0]; 

但是在实践中,gcc会忽视消除死锁的声明。 为了防止海湾合作委员会优化它,我重新写下声明如下:

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

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

closures优化解决了这个问题,但这是没有必要的。 更安全的select是使编译器通过使用volatiletypes限定符来优化存储是非法的。

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

volatiletypes限定符指示编译器严格关于内存存储和加载。 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")))来代替使用新的编译指示。 这具有仅应用于单个function而不是在同一文件中定义的所有function的优点。

用法示例:

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