我们知道,使用宏可以实现条件编译:
#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>结果编译不过去,大家如果有什么好的办法请告诉我,谢谢!