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

g++ turn off constant propagation for benchmarking?

本文关键字:基准测试 传播 常量 g++      更新时间:2023-10-16

我想在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);
}

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

在上面的示例中,我希望在编译时打开所有优化,除了input的值应该被视为在编译时未知。

我如何改变c++或传递一个标志到c++来做到这一点?

在gcc优化标志页面上有大量与常量传播相关的标志。这一切的微妙之处和确切意义我都搞不懂。

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

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

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

const volatile Input input;

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