首页 > 编程语言 > 详细

C++深度解析教程学习笔记(3)函数的扩展

时间:2017-10-28 01:00:49      阅读:372      评论:0      收藏:0      [点我收藏+]

1.内联函数

1.1.常量与宏的回顾

(1)C++中的 const 常量可以替代宏常数定义,如:

const int A = 3;
//等价于
#define A 3

(2)C++中是否有解决方案,可以用来替代宏代码片段呢?

1.2.内联函数的定义

(1)C++编译器可以将一个函数进行内联编译,被 C++编译器内联编译的函数叫内联函数。

(2)C++中使用 inline 关键字声明内联函数。如

inline int func(int a, int b)
{
     return a < b ? a : b;
}

(3)内联函数声明时 inline 关键字必须和函数定义结合在一起,否则编译器会直接忽略内联请求。(在 vs2013 下,inline 放在声明或定义前均可以)

1.3.内联函数的特点

(1)C++编译器直接将内联函数的函数体插入到函数调用的地方

(2)内联函数没有普通函数调用时的额外开销(压栈、跳转、返回)

(3)C++中推荐使用内联函数替代宏代码片段。

(4)C++编译器也不一定满足函数的内联请求。

#include <stdio.h>

#define FUNC(a, b) ((a) < (b) ? (a) : (b))

//MSVC下:要让inline、__forceinline生效必须得做如下的设置:
//①在“项目”→“配置属性”→“C / C++” →“优化”→“内联函数扩展”中选择“只适用于__inline(/ Ob1)”
//②在“配置属性”→“C / C++” →“所有选项”→“调试信息格式”中选择“程序数据库( / Zi)”

//VS2013下,inline可放在声明前或也可放在定义前。或两者前都加
inline int func(int a, int b) 
{
    return a < b ? a : b;
}

int main()
{
    int a = 1;
    int b = 3;

    //int c = FUNC(++a, b);//相当于(++a)<(b)?:(++a):(b);

    //printf("a = %d\n", a); //3
    //printf("b = %d\n", b); //3
    //printf("c = %d\n", c); //3

    int c = func(++a, b);

    printf("a = %d\n", a);//2
    printf("b = %d\n", b);//3
    printf("c = %d\n", c);//2

    return 0;
}

内联函数没嵌入到调用地方(仍为函数调用)

技术分享

函数体被嵌入到调用的地方

技术分享

1.4.内联函数与宏的不同

 

 

内联函数

处理方式

由预处理器处理,只是进行简单的文本替换

由编译器处理,会将函数体嵌入到调用的地方。但内联请求也可能被编译器拒绝

类型检查

不做类型检查

具有普通函数的特征,会进行参数和返回类型的检查。

副作用

C++深度解析教程学习笔记(3)函数的扩展

原文:http://www.cnblogs.com/CoderTian/p/7745766.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!