inline内联函数—macro宏的替代

本文探讨了C++中的内联inline函数和宏macro的使用,包括它们的特殊用途、优缺点。内联函数作为宏的替代品,解决了宏的一些问题,如代码可读性和调试困难,但同样存在无法调试和可能导致代码膨胀的问题。文章还提到了内联函数的声明与定义、使用注意事项以及在项目开发中的适用阶段。最后,作者分享了一个关于Get和Set方法背后封装思想的故事。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1)          macroC++的特殊(唯一)用途

l       方便输出变量名和值 #

#define Print(x) cout<< #x <<”=”<<x<<endl;

int a = 10;

Print( a ); // a = 10

 

l       连接变量名##

#define FIELD(a) char* a##_string; int a##_size

FIELD(one);

FIELD(two);

 

2)          macro的优缺点

l       宏不需调用函数就像函数一样的使用,也用于常量的定义。宏工作在预处理器层

l       宏的优点

没有了参数压栈、Call指令、Ret指令等函数开销

l       宏的缺点

1)      宏使得代码可读性差,需要注意很多东西,如++, --,表达式括号等问题

2)      宏像函数,而又不是函数,也不是表达式,也不是定义,容易迷惑读者

3)      宏不能访问类的数据成员,导致其不能作为成员函数

4)      宏没有地址,只是简单的替换,没有函数地址,不能调试

 

3)          内联inline函数的原理

l       工作在编译器层,编译器负责做参数检查,返回值类型转换,这是预处理器做不了的。

l       对于任何函数,编译器都会把函数声明放入符号表,而inline函数,同时将函数体(源码或汇编取决于编译器)放入符号表。当调用时,做必要的检查,然后插入代码,对于类成员函数,还会插入this指针。

 

4)          内联inline函数的使用

l       inline的使用

1)      在类中,如果声明和定义写在一起,则是inline函数

2)      在类外如果定义inline函数,必须声明和定义写在一起

3)      例如,inline void Func(); 然后再别处实现,则没有inline的效果

4)      一般将inline函数定义在头文件中,多个文件包含不会出现重定义(内部链接,保存在符号表里)

 

5)          内联inline函数的优缺点

l       inline函数的优点

1)      保留了宏的优点,当然,其不能定义常量,由const代劳

2)      解决了宏的缺点,除了不能调试

l       inline函数的缺点

1)      和宏一样,其不能调试,inline函数没有地址

2)      inline只是对编译器的一种暗示,编译器有最终inline与否的权利

当有循环时,一般不inline

当函数体超复杂或较大时,一般不inline

当函数内递归调用时,绝对不inline

当须取函数指针时,绝对不inline

3)      可能引起代码膨胀

 

6)          一个提示

l       当函数很大且复杂时,内联本身所带来的性能提升相比之下是微弱的,而且会引起代码膨胀,一般不用inline。编译器本身也会杜绝这种inline

l       内联函数不会出现重复定义,所以,在项目初期可以被大量使用;在后期可以有选择性的inline——先让它工作起来,然后再优化

l       inline函数不能是virtual的,因为virtual函数是需要有地址的。

 

7)          一个故事

l       我们经常可以看见有GetSet属性方法,这是因为经常需要获取/保存变量的值,而如果定义为public,则破坏封装性,所以用函数访问私有变量的方法。

l       定义函数名的时候,由于C++类函数名必须与数据成员不同,所以,只能在前面加个有意义的GetSet

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值