// C
int *pi = (int*)malloc(100);
if (p == Null)
return -1;
// C++
int *pi = new int[100];
// 无需像C语言一样检查返回值,如果出错,new会自动报出一个异常;new很少会失败,但是申请之后往往用户会忘记释放
try
{
int Ipi = new int[100];
}catch(const std::bad_alloc e)
{
cout<<"new error"<<endl;
cout<<e.what()<<endl;
return -1;
}
//一般异常会有这个机制,但是很少使用,可参照Google的标准:不要使用C++异常
int *pi = new (std::nothrow) int[10];
内联函数(inline function)
介于宏函数和普通函数之间
// main.cpp
#include <iostream>
using namespace std;
#define SQR(i) ((i) * (i))
int main()
{
int i = 0;
while(i < 5)
{
cout<<SQR(i++)<<endl; // [ERROR]
}
}
宏函数优缺点
+ 代码内嵌, 避免了函数调用(压栈和出栈)
- 易产生歧义;易使程序的text段体积增大 (浪费空间换取时间),不会进行类型检查
函数的优缺点
+ 一段高度抽象的逻辑,避免重复造轮子;不易产生歧义;使text段体积变小
- 函数调用的压栈与出栈的开销(浪费时间换取空间);会进行类型检查
在宏函数和函数之间:内联函数 inline
- 内嵌,减少压栈和出栈的开销
为什么不把所有的函数都inline?
Text段体积过大
inline变成了给编译器的一个建议
不加inline一定不会inline
加了inline系统会根据实际分析是否需要inline
Google关于inline给出的标准是:
只有当函数只有10行甚至更少时才会将其定义为内联函数(inline function)
华为给出的标准是5行甚至更少
inline的整体评价:
优点:避免调用时的额外开销(入栈与出栈操作)
代价:由于内联函数的函数体在代码段中会出现多个“副本”,因此会增加代码段的空间
本质:以牺牲代码段空间为低价,提高程序运行时间的效率
适用场景:函数体很“小”,且被“频繁”调用