我们知道,使用宏可以实现条件编译:
#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
可见GCC编译后,生成的代码里面并没有条件判断。
再使用微软的编译器试试:
; call E:/win2003_program/vs2005/VC/bin/vcvars32.bat
; cl.exe /FAs main.cpp
哎呀!微软的cl.exe还是加上了条件判断。我们再试试加上优化选项:
; call E:/win2003_program/vs2005/VC/bin/vcvars32.bat
; cl.exe /FAs main.cpp /O1
恩,很好!加上优化选项后,没有条件判断了。
综上所述:使用模板来进行条件编译,可以更加灵活,而且效率上不会有丝毫影响。
还有一个问题就是,每次调用都要加上func<true>或者func<false>,不知道有什么办法可以设置一个默认参数。我尝试template <bool value=true>结果编译不过去,大家如果有什么好的办法请告诉我,谢谢!



























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 |
再使用微软的编译器试试:
; 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>结果编译不过去,大家如果有什么好的办法请告诉我,谢谢!