永发信息网

宏和函数的区别

答案:3  悬赏:20  手机版
解决时间 2021-01-18 13:53
  • 提问者网友:献世佛
  • 2021-01-17 19:30
宏和函数的区别
最佳答案
  • 五星知识达人网友:woshuo
  • 2021-01-17 20:24
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楼网友:人间朝暮
  • 2021-01-17 22:43
宏是简单展开替换,用多少次就会替换多少次
函数是调用,不管用了多少次,还是只有一份代码
  • 2楼网友:神的生死簿
  • 2021-01-17 21:43
1.宏会在编译器在对源代码进行编译的时候进行简单替换,不会进行任何逻辑检测,即简单代码复制而已。
2.宏进行定义时不会考虑参数的类型。
3.参数宏的使用会使具有同一作用的代码块在目标文件中存在多个副本,即会增长目标文件的大小。
4.参数宏的运行速度会比函数快,因为不需要参数压栈/出栈操作。
5.参数宏在定义时要多加小心,多加括号。
6.函数只在目标文件中存在一处,比较节省程序空间。
7.函数的调用会牵扯到参数的传递,压栈/出栈操作,速度相对较慢。
8.函数的参数存在传值和传地址(指针)的问题,参数宏不存在。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯