c++入门(2)

宏常量引起的缺陷

#define PI "3.14"
int main()
{
	const int a=10;//常量,具有宏的属性,有类型,可以参加编译
	int *pa=(int*)&a;//a=100
	*pa=100;//*pa=100
	cout<<a<<endl;   //
	cout<<*pa<<endl;
	return 0;
}

在编译期间,a已经被10替换,所以打印出a=10,
而实际上,int pa=(int)&a,pa指向a,而*pa=100,也就是a空间里的10已经被修改成100,
int pa=(int)&a,a为常量,pa不能直接指向a,把a强制类型转换成普通类型指针。

内联函数

概念

以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数压栈的开销, 内联函数提升程序运行的效率。

#define Max(a,b)  (((a)>(b))?(a):(b))
int main()
{
	int a=10;
	int b=20;
	cout<<Max(a,b)<<endl;//20
	cout<<Max(++b,a)<<endl;//22
	return;
}

打印结果分别为20,22
宏在预处理时已经替换,传参时已经++一次,返回时又会++一次
c++中这种情况用内联函数来处理

inline int Add(int left,int right)
{
	return left+right;
}
int main()
{
	int a=10;
	int b=20;
	cout<<Add(a,b)<<endl;
	cout<<Add(++b,a)<<endl;//参与编译,在编译期间替换,安全性高
	return 0;
}
内联函数与宏定义的区别

一、宏定义和内联函数的区别

  1. 宏定义不是函数,但是使用起来像函数。预处理器用复制宏代码的方式代替函数的调用,省去了函数压栈退栈过程,提高了效率。

    内联函数本质上是一个函数,内联函数一般用于函数体的代码比较简单的函数,不能包含复杂的控制语句,while、switch,并且内联函数本身不能直接调用自身。如果内联函数的函数体过大,编译器会自动的把这个内联函数变成普通函数。

  2. 宏定义是在预编译的时候把所有的宏名用宏体来替换,简单的说就是字符串替换

    内联函数则是在编译的时候进行代码插入,编译器会在每处调用内联函数的地方直接把内联函数的内容展开,这样可以省去函数的调用的开销,提高效率

  3. 宏定义是没有类型检查的,无论对还是错都是直接替换

    内联函数在编译的时候会进行类型的检查,内联函数满足函数的性质,比如有返回值、参数列表等

  4. 宏定义和内联函数使用的时候都是进行代码展开。不同的是宏定义是在预编译的时候把所有的宏名替换,内联函数则是在编译阶段把所有调用内联函数的地方把内联函数插入。这样可以省去函数压栈退栈,提高了效率

内联函数和普通函数的区别
  1. 内联函数和普通函数的参数传递机制相同,但是编译器会在每处调用内联函数的地方将内联函数内容展开,这样既避免了函数调用的开销又没有宏机制的缺陷

  2. 普通函数在被调用的时候,系统首先要到函数的入口地址去执行函数体,执行完成之后再回到函数调用的地方继续执行,函数始终只有一个复制。

    内联函数不需要寻址,当执行到内联函数的时候,将此函数展开,如果程序中有N次调用了内联函数则会有N次展开函数代码

  3. 内联函数有一定的限制,内联函数体要求代码简单,不能包含复杂的结构控制语句。如果内联函数函数体过于复杂,编译器将自动把内联函数当成普通函数来执行

内联函数特性
  1. inline是一种以空间换时间的做法,省去调用函数额开销。所以代码很长或者有循环/递归的函数不适宜使 用作为内联函数。
  2. inline对于编译器而言只是一个建议,编译器会自动优化,如果定义为inline的函数体内有循环/递归等 等,编译器优化时会忽略掉内联。
  3. inline不建议声明和定义分离,分离会导致链接错误。因为inline被展开,就没有函数地址了,链接就会找不到。
    宏的优缺点?
    优点:
    1.增强代码的复用性。 2.提高性能。
    缺点:
    1.不方便调试宏。(因为预编译阶段进行了替换) 2.导致代码可读性差,可维护性差,容易误用。
    3.没有类型安全的检查 。
C++有哪些技术替代宏?
  1. 常量定义 换用const
  2. 函数定义 换用内联函数
发布了34 篇原创文章 · 获赞 4 · 访问量 1762

猜你喜欢

转载自blog.csdn.net/qq_41181857/article/details/88885234
今日推荐