本文主要讲解内联函数相关知识点,随便讲讲指针空值nullptr
目录
前言
一、概念
二、特性
二、指针空值nullptr(与前文关系不大)
前言
在学习内联函数前,我们先回顾一下宏。
将下面的函数改为宏函数应该怎么改呢?
int Add(int a, int b)
{return (a + b) * 10;
}
答案是:
#define Add(x,y) (((x)+(y))*10)
可见,宏函数有其优势,如不用调用栈帧,提高调用效率等,
但也有许多缺点,如可读性差,不可调试、没有类型安全的检查等。
因此,C++中增加了内联函数,可以很好地解决宏的大部分缺点,接下来我们就来学习一下内联函数的相关知识。
一、概念
以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数调用建立栈帧的开销,内联函数提升程序运行的效率。
inline int Add(int a, int b)
{return (a + b) * 10;
}
二、特性
1、inline是一种以空间换时间的做法,如果编译器将函数当成内联函数处理,在编译阶段,会用函数体替换函数调用。
缺陷:可能会使目标文件变大。
优势:少了调用开销,提高程序运行效率。
2、inline对于编译器而言只是一个建议,不同编译器关于inline的实现机制可能不同,一般建议将函数规模较小、不是递归、且频繁调用的函数采用inline修饰,否则编译器会忽略inline特性。
二、指针空值nullptr(与前文关系不大)
NULL实际上是一个宏,在传统的C头文件(stddef.h)中,可以看到如下代码
#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif
可以看到,NULL可能被定义为字面常量0,也可能被定义为无类型指针(void*)的常量。这就可能导致在使用时会遇到一些麻烦,如:
void f(int)
{cout << "f(int)" << endl;
}
void f(int*)
{cout << "f(int*)" << endl;
}
int main()
{f(0);f(NULL);//实际调用的是f(int)f((int*)NULL);return 0;
}
在C++98中,字面常量既可以是一个整型数字,也可以是无类型的指针(void*)常量,但编译器通常将其看做整型常量,要想将其按指针的方式来使用,必须强转(void*)0
在C++11中引入了一个新的关键字nullptr,它表示指针空值,
sizeof(nullptr)与sizeof((void*)0)所占字节数相同。
因此,为了提高代码的健壮性,在后续表示空值指针时,推荐使用nullptr。