我想在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上有大量与常量传播相关的标志。所有这些的细微之处和确切含义都在我身上消失了。
编辑:我没有兴趣完全关闭常量传播。我只是希望输入被视为在编译时不知道。
答案 0 :(得分:3)
我想模拟在编译时不知道输入的情况。我不一定想干扰编译器。
使系统不确定变量值的最简单方法是声明它volatile
:
const volatile Input input;
在函数调用之前,它的值将从内存中重新读取。函数内部不会受到干扰,否则将成为一个完全逼真的模拟。