【问题标题】:Inlining or identical code内联或相同的代码
【发布时间】:2012-11-17 11:25:02
【问题描述】:

如何设置编译器以生成相同的代码?对于示例

inline bool iszero(int a)
{
    return (a == 0);
}

int main()
{
    int a = 4;

    if(a == 0) // First
        a = 5;

    if(iszero(a)) // Second
        a = 5;

    ///...
}

在调试模式下(带内联)反汇编代码如下:

if(a == 0) // First
     a = 5;

bool temp; // Second
if(a == 0)
    temp = 0;
else
    temp = 1;

if(temp == 0)
    a = 5;

为什么会这样?

为什么会问这个问题?我需要使用内联函数调试我的应用程序(为了加快调试速度),并且我不想在调试模式下失去性能

【问题讨论】:

  • 所有编译器都在调试模式下生成愚蠢的代码,因为你告诉他们不要“浪费”任何时间让它变得更好。
  • @BoPersson,我可以只为内联函数打开优化吗?
  • 不,这是不可能的。您可以在发布模式下进行调试,但如果您愿意,遵循优化的代码会很多困难。我们大多数人只是接受调试模式很慢。
  • @BoPersson,好的。 “不正确”的内联比函数调用更快吗?
  • 我们不知道。在没有优化的情况下编译时,我们告诉编译器不要花任何时间来解决这个问题。结果将是不可预测的性能。

标签: c++ visual-studio visual-c++ inline disassembly


【解决方案1】:

在发布模式下编译,并进行全面优化。生成的代码将相当于:

int main()
{
}

比较没有优化的代码是没有意义的,因为在没有优化的情况下进行基准测试是没有意义的。

【讨论】:

  • 啊哈,我知道了 =) 我需要使用内联函数来调试我的应用程序(为了加快调试速度)并且我不想失去性能 处于调试模式。
  • @4Bytes: 那么你应该反其道而行之。使用调试信息在发布模式下编译,并禁用一些使其更难调试的优化(如内联)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-20
  • 2010-09-10
  • 2017-12-08
  • 1970-01-01
  • 1970-01-01
  • 2017-04-28
相关资源
最近更新 更多