再读C++的设计艺术(2)

Posted by Johan Niu on March 25, 2018

再读C++的设计艺术(2)

1 inline函数的设计

Bjarne Stroustrup(C++作者特别讨厌C里的宏定义),比如以下代码:

#define max(x,y) (x)>(y)?(x):(y);


...


int c = max(int a, int b)

C中实现宏定义,代码真正执行的时候,其实是

int c = (x)>(y)?(x):(y);

这样相比传统的声明函数,定义函数,调用函数,编译器无法对宏定义函数max进行检查了

没有了编译器的检查,往往很多错误就出现在宏定义。

但是如果不实现宏定义,使用传统的函数声明,定义,调用, 当频繁调用时候(比如我for循环1亿次),这样就会造成频繁的调用,进栈出栈操作

所以Bjarne Stroustrup在C++中使用inline关键字,如下:

inline unsigned long AddOne(unsigned long x, unsigned long y)
{
    return x += y;
} 


void main()
{
    unsigned long a = 0;
	for(unsigned long i = 0; i < 1000000000; i++)
	{
		a = AddOne(a, i)
	}
	count<<"a = "<<a<<endl;
}

上面这段代码在编辑器编译时候,会对inline函数AddOne进行编译器校验,但是执行的时候,代码为如下:

void main()
{
    unsigned long a = 0;
	for(unsigned long i = 0; i < 1000000000; i++)
	{
		a = a + i
	}
	count<<"a = "<<a<<endl;
}

这样既解决了C语言中宏定义没有编译器对函数校验的问题,同时保证了宏定义的执行速度优势。

inline函数:有类型检查的宏,没有标准函数的运行时内存结构。

注意:inline在有的版本中,只有release版本才会生效。

2 嵌套与调用

C/C++ 函数禁止嵌套定义,但是必须嵌套调用

C语言有个规定:全局区不能有可执行代码,可执行代码必须进入函数中。

但是C语言中的函数都是全局的,这就导致函数不能嵌套定义:嵌套定义导致函数内部定义的函数成了局部函数。

所以要解决各个函数的执行问题只能通过函数的嵌套调用。

这时就需要有一个函数首先被执行,来调用其他一系列的函数,完成程序的功能,

而这个第一个调用的函数就是main函数。

因此必须有main函数作为程序入口。(不像Python)

编译系统写好一套东西,让main函数被系统调用,这样程序才跑起来。