使用template实现条件编译

    我们知道,使用宏可以实现条件编译:
#if  1
    
// do something
#else
   
// do something else
#endif
     使用模板也能够达到类似的效果:
#include  < stdio.h >

template 
< bool  value >
void  func()
{
    
if (value)
    
{
        printf(
"true ");
    }

    
else
    
{
        printf(
"false ");
    }

}


int  main()
{
    func
<true>();
    
return 1;
}

    你可能会担心,使用if来判断是否会影响性能,我们可以看看编译器生成的代码究竟是怎么样的:
GCC编译器:
; g++ -o main.s main.cpp -S
.globl __Z4funcILb1EEvv
    .def    __Z4funcILb1EEvv;    .scl    2;    .type    32;    .endef
__Z4funcILb1EEvv:
    pushl    %ebp
    movl    %esp, %ebp
    subl    $8, %esp
    movl    $LC0, (%esp)
    call    _printf
    leave
    ret
    .def    _printf;    .scl    2;    .type    32;    .endef
    .def    __Z4funcILb1EEvv;    .scl    3;    .type    32;    .endef
    可见GCC编译后,生成的代码里面并没有条件判断。

   再使用微软的编译器试试:
;  call E:/win2003_program/vs2005/VC/bin/vcvars32.bat
;  cl.exe /FAs main.cpp
; Function compile flags: /Odtp
;    COMDAT ??$func@$00@@YAXXZ
_TEXT    SEGMENT
??$func@$00@@YAXXZ PROC                    ; func<1>, COMDAT

; 5    : {

    push    ebp
    mov    ebp, esp

; 6    :     if (value)

    mov    eax, 1
    test    eax, eax
    je    SHORT $LN2@func

; 7    :     {
; 8    :         printf("true/n");

    push    OFFSET $SG3676
    call    _printf
    add    esp, 4

; 9    :     }
; 10   :     else

    jmp    SHORT $LN3@func
$LN2@func:

; 11   :     {
; 12   :         printf("false/n");

    push    OFFSET $SG3678
    call    _printf
    add    esp, 4
$LN3@func:

; 13   :     }
; 14   : }

    pop    ebp
    ret    0
??$func@$00@@YAXXZ ENDP                    ; func<1>
_TEXT    ENDS

      哎呀!微软的cl.exe还是加上了条件判断。我们再试试加上优化选项:
;  call E:/win2003_program/vs2005/VC/bin/vcvars32.bat
;  cl.exe /FAs main.cpp /O1
PUBLIC    ??_C@_05LFIOBDML@true?6?$AA@            ; `string'
PUBLIC    ??$func@$00@@YAXXZ                ; func<1>
EXTRN    _printf:PROC
;    COMDAT ??_C@_05LFIOBDML@true?6?$AA@
; File f:/practice/c_c++/2008-01-03/testtemplate/main.cpp
CONST    SEGMENT
??_C@_05LFIOBDML@true?6?$AA@ DB 'true', 0aH, 00H    ; `string'
; Function compile flags: /Ogspy
CONST    ENDS
;    COMDAT ??$func@$00@@YAXXZ
_TEXT    SEGMENT
??$func@$00@@YAXXZ PROC                    ; func<1>, COMDAT

; 6    :     if (value)
; 7    :     {
; 8    :         printf("true/n");

    push    OFFSET ??_C@_05LFIOBDML@true?6?$AA@
    call    _printf
    pop    ecx

; 9    :     }
; 10   :     else
; 11   :     {
; 12   :         printf("false/n");
; 13   :     }
; 14   : }

    ret    0
??$func@$00@@YAXXZ ENDP                    ; func<1>
_TEXT    ENDS
     恩,很好!加上优化选项后,没有条件判断了。

    综上所述:使用模板来进行条件编译,可以更加灵活,而且效率上不会有丝毫影响。

    还有一个问题就是,每次调用都要加上func<true>或者func<false>,不知道有什么办法可以设置一个默认参数。我尝试template <bool value=true>结果编译不过去,大家如果有什么好的办法请告诉我,谢谢!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值