gcc中的编译器优化

3

我有一段C代码并正在进行测试。我需要以“只读”模式访问数组。我正在尝试以下操作:

for (int i= 0; i < 1000; i++){
    int a = shared_array[rand() % 64];
    int b = shared_array[rand() % 64];
}

我的问题是:如何从内存中提取一个值,确保编译器不通过删除这些指令来进行优化,因为在我的测试中,我对这些值没有做任何操作。即使我添加了一个操作 int v = a + bv 也没有在其他地方使用,所以它可能会被忽略。
我正在使用带有 -O3 的 gcc,并且我需要这样做才能将其与另一个来源的结果进行比较。

当然,您可以将它们添加到在循环外声明的累加器中,以便每次迭代都对结果产生影响。 - Magnus Reftel
不是与问题相关,但将“%64”替换为“&63”可能会稍微提高性能(如果它没有被内存延迟隐藏)。此外-这并不能保证均匀分布。 - Leeor
3个回答

6

如果你想让编译器读取一个不被使用的变量,常规的方法是将其设为volatile。这可以确保编译器在变量被使用时从RAM中读取/写入它。


3
根据C标准,这个方法“保证”可行。但是GCC是否遵循C标准是另一回事。 - Lundin
@Jens确实,这是一个C++的概念。没有注意到这是一个C语言的问题。我解除了混淆“:-)”。 - rubenvb

1
在当前编译单元(源文件)中未定义的函数中使用ab

0

volatile 关键字告诉编译器不要优化该代码。这适用于变量和函数。甚至可以在内联汇编中使用此关键字,这是一个更高级的主题。请参见 this question

通常在类型说明符后应用它,例如:int volatile i = 0;


volatile T == T volatile,除非T是某种指针类型。 - rubenvb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接