首先,说说三个名词的基本概念:
1、宏定义:一种简单的发生在编译之前的文本插入替换。
语法: #define p_char char*
注意!不需要分号标识结束
2、typedef:发生在编译期间,用于定义类型别名
语法:typedef char* p_char;
注意!需要分号标识结束
typedef可以用于各种数据结构的别名定义,但是宏定义比起typedef更容易引起危险。详见以下示例:
#include<iostream>
#define a_char char*
typedef char* b_char;
int main()
{
a_char p1,p2; //p1是个char指针,p2是个char变量
b_char p3,p4; //p3,p4都是char指针
return 0;
}
3、内联函数(inline)发生在编译期间
用法:inline用在定义函数时使用
inline ret_val A
{
...
return ...;
}
以上代码发生在程序员想告诉编译器:我定义了返回值为ret_val的函数A!调用函数的时候不要调用它!而是插入函数体的返回值!
具体例子如下(代码转载自https://blog.csdn.net/cpongo3/article/details/93996094):
inline char* dbtest(int a)
{
return (i % 2 > 0) ? "奇" : "偶";
}
int main()
{
int i = 0;
for (i=1; i < 100; i++)
{
printf("i:%d 奇偶性:%s /n", i, dbtest(i));
}
}
上面的例子就是标准的内联函数的用法,使用inline修饰带来的好处我们表面看不出来,其实在内部的工作就是在每个for循环的内部任何调用dbtest(i)的地方都换成了(i%2>0)?“奇”:"偶"这样就避免了频繁调用函数对栈内存重复开辟所带来的消耗。
内联函数与define都执行了替换,那么性能如何变化呢?
内联函数减少了函数调用,但是增加了代码编译量。
显然,很长的代码不适合内联(PS,内联中不能自己递归自己),因为多出的编译成本远大于函数调用成本的减少量。短代码适合内联!