请问g ++ DoTheRightThing™?

时间:2014-05-02 18:09:52

标签: optimization g++

在下面的代码段中,我的目的是从各种可能性强制输入参数的一些特定值。我正在使用g ++版本4.7.2并关闭所有优化,我的问题是编译器是否遵守了预期的执行顺序。

int
MP3Filter::checkBitrate(int nBitrate)
{
    // ##########################################
    // this assumes a specific order of execution
    // ?? will the compiler mess with this ??

    if      (nBitrate <= 32)    return 32;
    else if (nBitrate <= 40)    return 40;
    else if (nBitrate <= 48)    return 48;
    else if (nBitrate <= 56)    return 56;
    else if (nBitrate <= 64)    return 64;
    else if (nBitrate <= 80)    return 80;
    else if (nBitrate <= 96)    return 96;
    else if (nBitrate <= 112)   return 112;
    else if (nBitrate <= 128)   return 128;
    else if (nBitrate <= 160)   return 160;
    else if (nBitrate <= 192)   return 192;
    else if (nBitrate <= 224)   return 224;
    else if (nBitrate <= 256)   return 256;
    return 320;
}

有没有办法告诉g ++不要弄乱特定的代码部分?

更新:感谢您的评论。也许我有点太仓促发帖了。我的代码存在一些问题,而且这个例程似乎没有按照我的意图运行。因此,由于所有常量,我只是怀疑编译器正在优化某些东西。但是你已经为我澄清了一些事情。

再次感谢, -Andres

2 个答案:

答案 0 :(得分:4)

优化应与此代码无关。编译器需要生成符合语言标准要求的行为的代码,在这种情况下,函数可以为任何特定参数值返回的值没有灵活性。

只要函数返回所需的结果,编译器就可以生成它喜欢的任何代码。如果您正在从函数中获得正确的结果,那么语言标准已经涵盖了这一点。要么g ++做得对,要么g ++有bug。 (我不知道这方面有任何g ++错误,如果有这样的错误,我会感到惊讶。)

如果您关心的是除了使函数返回正确的结果(例如,CPU指令的特定序列)之外的其他内容,那么(a)我不得不怀疑为什么你&#d; d关心,以及(b)C ++不是一种允许你强加这种约束的语言。如果指令序列对您很重要,您可以考虑使用汇编语言。

你究竟关注什么?

答案 1 :(得分:0)

我认为你可以告诉g ++使用-O0标志关闭所有优化。你关注优化器吗?关于这段代码没有什么突出的让我觉得它不能正确编译。