宏的使用:
因为函数的调用必须要将程序执行的顺序转移到函数所存放在内存中的某个地址,将函数的程序内容执行完后,再返回到转去执行该函数前的地方。这种转移操作要求在转去执行前要保存现场并记忆执行的地址,转回后要恢复现场,并按原来保存地址继续执行。因此,函数调用要有一定的时间和空间方面的开销,于是将影响其效率。而宏只是在预处理的地方把代码展开,不需要额外的空间和时间方面的开销,所以调用一个宏比调用一个函数更有效率。
但是宏也有很多的不尽人意的地方。1、宏不能访问对象的私有成员。
2、宏的定义很容易产生二意性。
内联函数:
内联函数和宏的区别在于,宏是由预处理器对宏进行替代,而内联函数是通过编译器控制来实现的。而且内联函数是真正的函数,只是在需要用到的时候,内联函数像宏一样的展开,所以取消了函数的参数压栈,减少了调用的开销。你可以象调用函数一样来调用内联函数,而不必担心会产生于处理宏的一些问题。
我们可以用Inline来定义内联函数,不过,任何在类的说明部分定义的函数都会被自动的认为是内联函数。
内联函数的注意点:
1,内联函数使用inline开声明函数,声明之后编译器不会真正的创建函数,而只是将这个内联函数的所有代码复制到调用函数中,这样不会
跳转了,自然提高了程序的运行时的效率,但是复制代码会增大程序的体积。
2,内联函数的函数体过大,一般的编译器会放弃内联方式,而采用普通的方式调用函数。
在C++中,在类的内部定义了函数体的函数,被默认为是内联函数。而不管你是否有inline关键字。
//
// inline.cpp
// C++primary
//
// Created by amesty on 16/5/11.
// Copyright © 2016年 travelrely. All rights reserved.
//
#include <stdio.h>
#include <iostream>
using namespace std;
inline int func(int); //使用inline将带有一个int变量并返回int值的函数func说明为内联函数
int main()
{
int x;
cout<<"请输入一个数字\n";
cin>>x; //将用户输入的数字保存在x变量中
cout<<"\n";
cout<<"输入的数字为:"<<func(x)<<endl; //将该变量作为参数传递到函数func(x)中。由于该函数是个内联函数,它的所有代码都被直接复制在该行的func(x)处,因此这里不会跳转到第12行去执行func函数体中的语句
return 0;
}
int func(int x) //函数定义头
{ //函数体
return x; //该行代码会被直接复制到第10行的func(x)处
}