g ++关闭常量传播以进行基准测试?

时间:2014-03-09 22:12:33

标签: c++ g++

我想在C ++中使用一些使用硬编码输入的函数调用来运行函数的简单基准。

inline Output simple_func_to_test(const Input input);

int main(int argc, char* argv[]) {
    // The value of input is known at compile time.
    const Input input;
    // The value of output can be deduced at compile time.
    Output output = simple_func_to_test(input);
}

我没有详细了解汇编,但是通过检查使用带有Ofast的g ++ 4.8生成的汇编,似乎编译器正在优化函数并在编译时评估输出值。例如,涉及乘法的C ++函数生成不进行乘法的程序集。

在上面的例子中,我想在打开所有优化的情况下进行编译,但输入值应该被视为在编译时不知道。

如何更改C ++或将标志传递给g ++来执行此操作?

在gcc optimization flags page上有大量与常量传播相关的标志。所有这些的细微之处和确切含义都在我身上消失了。

编辑:我没有兴趣完全关闭常量传播。我只是希望输入被视为在编译时不知道。

1 个答案:

答案 0 :(得分:3)

  

我想模拟在编译时不知道输入的情况。我不一定想干扰编译器。

使系统不确定变量值的最简单方法是声明它volatile

const volatile Input input;

在函数调用之前,它的值将从内存中重新读取。函数内部不会受到干扰,否则将成为一个完全逼真的模拟。