编译器是否注意像if(0)这样无用的代码?

时间:2015-06-08 08:00:11

标签: c ffmpeg compiler-optimization

最近,我正在编译windows下的ffmpeg代码,使用带有intel编译器的VS2010。 对于以下代码:

void ff_dcadsp_init(DCADSPContext *s)
{
    s->lfe_fir = dca_lfe_fir_c;
    if (ARCH_ARM) ff_dcadsp_init_arm(s);
}

ARCH_ARM定义为0

当我在linux下编译它时,目标文件中的ff_dcadsp_init_arm()中没有函数,而它在windows下却没有?所以我想确定编译器是否会对无用代码以及如何为INTEL编译器设置它做一些事情。

2 个答案:

答案 0 :(得分:5)

通常,大多数编译器都能够处理那种 dead 代码,有效地删除了特定的指令/块。但是,AFAIK不是保证,可能在编译器和/或提供的优化级别设置之间有所不同。

但是,如果您希望在预处理状态下处理它(应该是更好的方法,恕我直言,因为ARCH_ARM是MACRO),您可以使用#if预处理器语句,删除对编译器优化级别的依赖。

例如,一般

void ff_dcadsp_init(DCADSPContext *s)
{
    //something common code

    #if ARCH_ARM                 //this {#if...#endif} block 
        ff_dcadsp_init_arm(s);   //only get compiled if ARCH_ARM evaluates to non-zero
    #endif

   //something more common code
}

答案 1 :(得分:2)

如果ARCH_ARM是一个宏,那么您可能会更喜欢以下内容:

void ff_dcadsp_init(DCADSPContext *s)
{
    s->lfe_fir = dca_lfe_fir_c;
    #if ARCH_ARM != 0
        ff_dcadsp_init_arm(s);
    #endif
}

然后,您 C标准本身并没有强制要求#34;死亡"代码被删除,这完全取决于每个实现如何实现它。

标准C强制使用标准C功能,例如#if ,因此更加便携。