永发信息网

宏和函数的区别

答案:3  悬赏:20  手机版
解决时间 2021-01-18 13:53
宏和函数的区别
最佳答案
1/ 宏只是预编译时一一展开,没有类型检查,可能产生二义性;同时宏写的函数不容易直观看懂。
#define MAX(a,b) ( (a)<(b)?(b):(a) )

2/ 内联函数并不总是被内联,inline对于编译器不是强制性的,缟译器根椐内联函数代码行数决定是否参于内联,从编译后生成的目标代码大小就能看出到底编译器是否真的内联了,调用1次和调用2次目标代码空间是不一样的。
template
inline void Count( const T& a, const T& b )
{
printf("always_inline?");
printf("always_inline?");
printf("always_inline?");
printf("always_inline?");

int c = a + b;
}

3/ 那么我们就强置内联好了,编译时会出现什么问题呢?
template
inline __attribute__((always_inline)) void Count( const T& a,const T& b )
{
printf("always_inline?");
printf("always_inline?");
printf("always_inline?");

int c = a + b;
}
Test.h:25: sorry, unimplemented: inlining failed in call to 'void Count(const T&, const T&) [with T = int]': function body not available
// 说明模板不能参于强制内联

4/ 去掉模板声明,采取强制内联是有效果的,并且随着调用次数的增加目标代码是不断增大的,说明强制内联起作用了,那它真达到宏的作用了吗?
inline __attribute__((always_inline)) void Count( int a,int b )
{
printf("always_inline?");
printf("always_inline?");
printf("always_inline?");

int c = a + b;
}

5/ 那我们改一下再和宏比较, 调用强制Count版本两次,没有报变量c被重复定义,不知道为什么? 难道可以获取到每一次调用Count的函数地址吗(实际GDB时就没有Count函数的概念)? 如果调用宏版本的Count,是会报变量c被重复定义,简单替换啦.
inline __attribute__((always_inline)) void Count( int a,int b )
{
printf("always_inline?");
printf("always_inline?");
printf("always_inline?");

int c = a + b;
}

#define Count(a,b) \
printf("always_inline?"); \
printf("always_inline?"); \
printf("always_inline?"); \
int c = a + b
全部回答
宏是简单展开替换,用多少次就会替换多少次
函数是调用,不管用了多少次,还是只有一份代码
1.宏会在编译器在对源代码进行编译的时候进行简单替换,不会进行任何逻辑检测,即简单代码复制而已。
2.宏进行定义时不会考虑参数的类型。
3.参数宏的使用会使具有同一作用的代码块在目标文件中存在多个副本,即会增长目标文件的大小。
4.参数宏的运行速度会比函数快,因为不需要参数压栈/出栈操作。
5.参数宏在定义时要多加小心,多加括号。
6.函数只在目标文件中存在一处,比较节省程序空间。
7.函数的调用会牵扯到参数的传递,压栈/出栈操作,速度相对较慢。
8.函数的参数存在传值和传地址(指针)的问题,参数宏不存在。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
男人经常做熏蒸好不好
2017年用“顺”字和“丰”字给公司写对联怎么
原价28元、BV1.4怎样算出多少钱?
卧室球形门锁把外面球砸掉后怎么开?
4.7*5.9 4*1*4.7简算
怎么区分火狐国际版和火狐中文版
邮件上标有1.64m是什么意思?
支线任务有时期限制吗
如何申请去台湾进修?
盗墓笔记霸气个性签名
成都大观公园在哪里?
凤鸣曲的歌词是什么?
Photoshop8.0cs界面怎么这样?怎么恢复啊?
用 cisco packet Trcer 软件 做路由器广域网p
成自泸高速公路到仁寿怎么走
推荐资讯
请问三万平米的中等水平的小区绿化成本大概多
打黑被抓可以我律师吗
汽车尾部的字母标志都代表什么都是什么意思?
剪爱形象设计地址好找么,我有些事要过去,
3月去厦门会遇到雨季吗?
阿拉善玛瑙什么样的最好
沈阳宜家地址
轻轨一号线三阳路站离武汉楚剧院有多远
请问一汽丰田锐志的最低排量是多少啊?
天地合闭,包罗万物在内是什么意思
环氧乙烷是怎样的来的
萨尔瓦多·达利是超现实主义绘画级人物。他的
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?