本文原载于http://blog.youkuaiyun.com/flyingBox/archive/2005/12/31/567291.aspx
1. 宏做的是简单的字符串替换
(
注意是字符串的替换
,
不是其他类型参数的替换
),
而函数的参数的传递
,
参数是有数据类型的
,
可以是各种各样的类型
.
2.
宏的参数替换是不经计算而直接处理的
,
而函数调用是将实参的值传递给形参
,
既然说是值
,
自然是计算得来的
.
3.
宏在编译之前进行
,
即先用宏体替换宏名
,
然后再编译的
,
而函数显然是编译之后
,
在执行时
,
才调用的
.
因此
,
宏占用的是编译的时间
,
而函数占用的是执行时的时间
.
4.
宏的参数是不占内存空间的
,
因为只是做字符串的替换
,
而函数调用时的参数传递则是具体变量之间的信息传递
,
形参作为函数的局部变量
,
显然是占用内存的
.
5.
函数的调用是需要付出一定的时空开销的
,
因为系统在调用函数时
,
要保留现场
,
然后转入被调用函数去执行
,
调用完
,
再返回主调函数
,
此时再恢复现场
,
这些操作
,
显然在宏中是没有的
.
所谓
"
内联函数
"
就是将很简单的函数
"
内嵌
"
到调用他的程序代码中
,
只样做的目的是为了避免上面说到的第
5
点
,
目的旨在节约下原本函数调用时的时空开销
.
但必须注意的是
:
作为内联函数
,
函数体必须十分简单
,
不能含有循环、条件、选择等复杂的结构,否则就不能做为内联函数了。事实上,即便你没有指定函数为内联函数,有的编译系统也会自动将很简单的函数作为内联函数处理;而对于复杂的函数,即便你指定他为内联函数,系统也不会理会的。