在下面的代码段中,我的目的是从各种可能性强制输入参数的一些特定值。我正在使用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
答案 0 :(得分:4)
优化应与此代码无关。编译器需要生成符合语言标准要求的行为的代码,在这种情况下,函数可以为任何特定参数值返回的值没有灵活性。
只要函数返回所需的结果,编译器就可以生成它喜欢的任何代码。如果您正在从函数中获得正确的结果,那么语言标准已经涵盖了这一点。要么g ++做得对,要么g ++有bug。 (我不知道这方面有任何g ++错误,如果有这样的错误,我会感到惊讶。)
如果您关心的是除了使函数返回正确的结果(例如,CPU指令的特定序列)之外的其他内容,那么(a)我不得不怀疑为什么你&#d; d关心,以及(b)C ++不是一种允许你强加这种约束的语言。如果指令序列对您很重要,您可以考虑使用汇编语言。
你究竟关注什么?
答案 1 :(得分:0)
我认为你可以告诉g ++使用-O0标志关闭所有优化。你关注优化器吗?关于这段代码没有什么突出的让我觉得它不能正确编译。