【发布时间】:2017-11-01 23:21:52
【问题描述】:
因此,对于内联函数(1-2 语句)和小宏,使用宏或内联函数之间似乎没有太大的性能差异。
但是,考虑到较大函数的函数调用开销,我想知道,
- GCC 7.0
- C 语言(非 C++)
- OSX(不确定这是否会在跨平台上有很大差异)
将大型宏用于 switch 语句会比将它们放入等效的函数调用中更快吗?这是我的一部分,假设不会内联如此大的函数。这是我的示例代码。
#define LEX_CHAR(chPtr, tag) switch(*chPtr) { \
case 'a':\
case 'b':\
case 'c':\
case 'e':\
case '$': tag = Tag_A;\
break; \
case '0':\
case '1':\
case '2':\
case '3': tag = Tag_B;\
break;\
case 'r':\
if(chPtr[1] == 'd' || chPtr[1] == '@') tag = Tag_c;\
else tag = Tag_B;\
break;\
case '+':\
case '#':\
case '!':\
if(chPtr[1] == 'd') tag = Tag_C;\
case '-':\
case '^':\
tag = Tag_D;\
break;\
default:\
tag = Tag_B;\
}
enum Tag
{
Tag_A,
Tag_B,
Tag_C,
Tag_D
};
typedef enum Tag Tag;
void Lex_Char(char* chPtr, Tag* tag)
{
switch(*chPtr) {
case 'a':
case 'b':
case 'c':
case 'e':
case '$': *tag = Tag_A;
break;
case '0':
case '1':
case '2':
case '3': *tag = Tag_B;
break;
case 'r':
if(chPtr[1] == 'd' || chPtr[1] == '@') *tag = Tag_C;
else *tag = Tag_B;
break;
case '+':
case '#':
case '!':
if(chPtr[1] == 'd') *tag = Tag_C;
case '-':
case '^':
*tag = Tag_D;
break;
default:
*tag = Tag_B;
}
}
那么在宏和函数这两者之间,使用宏而不是函数有什么优化吗?
【问题讨论】:
-
你应该测量......
-
是的。测量,然后转储宏。
-
内联函数是要走的路。让编译器来思考。
-
@wildplasser 但大函数也可以内联吗?
-
而且:您的两个实现都受到以下事实的困扰:他们无法向调用者报告他们消耗了多少字符:
void Lex_Char(...)