How could my code tell a compile-time constant versus a variable?

后端 未结 3 2061
情话喂你
情话喂你 2020-12-10 08:32

Here\'s my problem. I have a BINARY_FLAG macro:

#define BINARY_FLAG( n ) ( static_cast( 1 << ( n ) ) )

Whic

3条回答
  •  盖世英雄少女心
    2020-12-10 08:37

    This is simpler than you think :)

    Let's have a look:

    #include 
    
    static inline int FLAG(int n) {
        assert(n>=0 && n<32);
        return 1<

    I don't use MSVC, but I compiled with Mingw GCC 4.5:

    g++ -c -S -O3 08042.cpp

    The resulting code for first method looks like:

    __Z5test1i:
        pushl   %ebp
        movl    %esp, %ebp
        subl    $24, %esp
        movl    8(%ebp), %ecx
        cmpl    $31, %ecx
        ja  L4
        movl    $1, %eax
        sall    %cl, %eax
        leave
        ret
    L4:
        movl    $4, 8(%esp)
        movl    $LC0, 4(%esp)
        movl    $LC1, (%esp)
        call    __assert
        .p2align 2,,3
    

    And the second:

    __Z5test2v:
        pushl   %ebp
        movl    %esp, %ebp
        movl    $32, %eax
        leave
        ret
    

    See? The compiler is smart enough to do it for you. No need for macros, no need for metaprogramming, no need for C++0x. As simple as that.

    Check if MSVC does the same... But look - it's really easy for the compiler to evaluate a constant expression and drop the unused conditional branch. Check it if you want to be sure... But generally - trust your tools.

提交回复
热议问题