Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Does the compiler take care the useless codes like if(0)?

Recently, I am compiling the ffmpeg codes under windows use the VS2010 with intel compiler. For the following codes:

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

the macro ARCH_ARM is defined as 0.

When I compile it under linux, there is no function in ff_dcadsp_init_arm() in the object file, while it does under windows? So I want to make sure if the compiler will do something about the useless codes and how to set it for INTEL compiler.

like image 249
xkfz007 Avatar asked Mar 15 '23 19:03

xkfz007


2 Answers

Usually, most compilers are capable of taking care of that kind of the dead code, effectively removing that particular instruction / block. However, AFAIK it is not guaranteed and may differ between compilers and / or supplied optimization level settings.

However, if you want this to be handled in the preprocessing state itself (should be a better approach, IMHO, as ARCH_ARM is a MACRO), you can make use of #if preprocessor statements, to remove the dependency on compiler optimization level.

For example, in general

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
}
like image 123
Sourav Ghosh Avatar answered Mar 31 '23 17:03

Sourav Ghosh


If ARCH_ARM is a macro, you'd probably be better off with something like:

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

Then you don't have to concern yourself with what an optimiser will do. The C standard itself doesn't mandate that "dead" code is removed, this is totally down to how each implementation wants to do it.

The use of standard C functionality like #if is mandated by the standard, and therefore much more portable.

like image 30
paxdiablo Avatar answered Mar 31 '23 18:03

paxdiablo