宏、函数、宏函数的区别

宏、函数、宏函数的区别

先说宏和函数的区别:

1. 宏做的是简单的字符串替换(注意是字符串的替换,不是其他类型参数的替换),而函数的参数的传递,参数是有数据类型的,可以是各种各样的类型.

2. 宏的参数替换是不经计算而直接处理的,而函数调用是将实参的值传递给形参,既然说是值,自然是计算得来的.

3. 宏在编译之前进行,即先用宏体替换宏名,然后再编译的,而函数显然是编译之后,在执行时,才调用的.因此,宏占用的是编译的时间,而函数占用的是执行时的时间.

4. 宏的参数是不占内存空间的,因为只是做字符串的替换,而函数调用时的参数传递则是具体变量之间的信息传递,形参作为函数的局部变量,显然是占用内存的.

5. 函数的调用是需要付出一定的时空开销的,因为系统在调用函数时,要保留现场,然后转入被调用函数去执行,调用完,再返回主调函数,此时再恢复现场,

这些操作,显然在宏中是没有的.

现在来看内联函数:

所谓"内联函数"就是将很简单的函数"内嵌"到调用他的程序代码中,只样做的目的是为了避免上面说到的第5点,目的旨在节约下原本函数调用时的时空开销.但必须注意的是:作为内联函数,函数体必须十分简单,不能含有循环、条件、选择等复杂的结构,否则就不能做为内联函数了。事实上,即便你没有指定函数为内联函数,有的编译系统也会自动将很简单的函数作为内联函数处理;而对于复杂的函数,即便你指定他为内联函数,系统也不会理会的。

函数和宏函数的区别就在于,宏函数占用了大量的空间,而函数占用了时间。大家要知道的是,函数调用是要使用系统的栈来保存数据的,如果编译器里有栈检查选项,一般在函数的头会嵌入一些汇编语句对当前栈进行检查;同时,CPU也要在函数调用时保存和恢复当前的现场,进行压栈和弹栈操作,所以,函数调用需要一些CPU时间。

而宏函数不存在这个问题。宏函数仅仅作为预先写好的代码嵌入到当前程序,不会产生函数调用,所以仅仅是占用了空间,在频繁调用同一个宏函数的时候,该现象尤其突出。

1. 宏在编译之前进行,即先用宏体替换宏名,然后再编译的,而函数显然是编译之后,在执行时,才调用的.因此,宏占用的是编译的时间,而函数占用的是执行时的时间.

这句分开解释:

"" 宏在编译之前进行,即先用宏体替换宏名,然后再编译的,""

解释:假设代码中有这么一条宏定义:#define MAX_LEN 10(10是宏体, MAX_LEN 是宏名)则在编译之前, 也就是在预编译的时候会将代码中所有出现MAX_LEN的地方替换成10后在进行下面的代码编译, 这种替换工作实在编译之前进行的…

"" 而函数显然是编译之后,在执行时,才调用的""

解释: 函数调用实在执行时才调用的这是显然的, 因为只有执行时才能根据具体的条件决定调用哪个函数

""因此,宏占用的是编译的时间,而函数占用的是执行时的时间. ""

解释:有了上面的解释,估计这句话也就知道了, 从他的这句话看书的作者把预编译也算作编译的一部分了…

2.宏的参数是不占内存空间的,因为只是做字符串的替换,而函数调用时的参数传递则是具体变量之间的信息传递,形参作为函数的局部变量,显然是占用内存的.

同样分开解释:

"" 宏的参数是不占内存空间的,因为只是做字符串的替换""

解释:假设有这么个宏定义#define MAX(a, b) (a) > (b) ? (a) : (b) 代码中所有出现(初定义外)MAX(a, b)的地方在预编译以后都变成了 (a) > (b) ? (a) : (b)这个式子, 比如代码中有c = MAX(1, 3)这样的语句, 则在预编译的时候就会变成c = (1) > (3) ? (1) : (3), 这是一种直接的替换, 不会产生中间变量, 所以也就不用为之分配空间 …

"而函数调用时的参数传递则是具体变量之间的信息传递,形参作为函数的局部变量,显然是占用内存的."

解释: 函数调用时需要为每个形式参数在栈上分配空间, 然后将实参的值拷贝进去, 在函数的内部用的都是这个形参, 当函数结束后形参的空间会被自动释放掉, 这也是为什么形参的改变无法改变实参的值的原因…

==================================================

宏: 内联函数:

1.由预处理器处理 1.编译器处理

2.对++/–操作有副作用 2.可能会被编译器拒绝(不一定内联)

3.难于调试 3.可能造成代码膨胀

4.必定被展开

*************************************************************************************************************

宏函数和函数的使用小结:

函数体量很小时,为了减小系统的开销时间,可以使用宏函数,而函数体比较复杂(需要递归、循环、判断、选择等…)的情况下,使用函数来定义可以避免宏函数定义带来的副作用。 宏函数是在程序编译时进行简单的字符替换,而函数是在程序生成后才进行调用,这时会占用开销时间(主程序函数保留现场,在子函数体中需要进行参数的传递–实参传递给形参以及调用完后形参的销毁等步骤 ),因此宏函数占用的编译时的时间,而函数占用的是执行时的时间。 因此在函数体量简单的情况下,使用宏函数可以极大的提高程序的执行效率和系统开销。

发表回复

相关推荐

韩剧里频频出现的SBS、KBS、月火剧、水木剧是啥?

韩国三大电视台「SBS、KBS、MBC」 两家有线电视「 tvN、JTBC」

· 18秒前

使用mcsm面板搭建我的世界服务器

去blog阅读原文体验更加哦: 视频教程 更加详细,适合极度小白人士。 咕咕咕了两周的视频 ps:不敢说话 使用雨云游戏云面板服 ...

· 3分钟前

西安十大爬山好去处

西安十大爬山好去处 1、翠华山 翠华山原名太乙山,地处西安以南23公里秦岭北脉,海拔高度2132米,西峰海拔1414米,是西安爬 ...

· 3分钟前

實力碾壓!法國非洲軍團的馬裡加奧之戰

如果不能搞明白西方在非洲的軍事行動,就很難理解非洲對西方的態度;而任何宏大敘事都應該有細節支撐,否則既難以生動也容易...

· 6分钟前

從“埃森哲裁員”看企業裁員背後的經濟補償

案情介紹 3月24日,全球T外包服務和咨詢公司埃森哲宣佈,計劃在未來18個月內裁員1.9萬人,占現有員工的25%。大中華地區的大連...

· 6分钟前