我正在处理的项目是用C语言编写的,并使用预处理器宏来处理错误。
宏看起来像:
#define logevent(level, msg) \
do {
int _level = level; \
somefunction(_level, msg); \
someotherfunction(_level, msg); \
if (_level >= ERROR) \
__assume(0); \
} while(0)
假设某个函数确实退出(1),如果等级> =错误,当我们调用logevent(ERROR,“something”)时,我们永远不会将它转到if条件;其中ERROR是定义的常量。 问题是,由于if条件基于_level变量而不是级别常量,MSVC似乎无法优化if条件。 _level变量需要停止对级别表达式的多次评估。
某些其他编译器似乎能够优化if,但我想知道这是否是MSVC编译器的限制,或者是否有什么我可以启用以使编译器在条件消失的情况下优化这些?
答案 0 :(得分:7)
MSVC 2013将优化我们的表达。以下输入
#define ERROR 1
void somefunction(int level, char const* msg) {
printf("FUNC1 %d: %s\n", level, msg);
}
void someotherfunction(int level, char const* msg) {
printf("FUNC2 %d: %s\n", level, msg);
if (level >= ERROR) {
exit(1);
}
}
#define logevent(level, msg) \
do { \
int _level = level; \
somefunction(_level, msg); \
someotherfunction(_level, msg); \
if (_level >= ERROR) \
__assume(0); \
} while (0)
int _tmain(int argc, _TCHAR* argv[])
{
logevent(ERROR, "HALLO");
printf("Hallo\n");
getchar();
return 0;
}
将编译为
00CB1000 push 0CB2120h
00CB1005 push 1
00CB1007 push 0CB2100h
00CB100C call dword ptr ds:[0CB2090h]
00CB1012 push 0CB2120h
00CB1017 push 1
00CB1019 push 0CB2110h
00CB101E call dword ptr ds:[0CB2090h]
00CB1024 add esp,18h
00CB1027 push 1
00CB1029 call dword ptr ds:[0CB208Ch]