主要讨论c89版本和c++99版本修订后的区别
1.带有默认值的函数(c++支持,C语言不支持)
例:
int sum(int a,int b=10)
{
return a+b;
}
int main()
{
int a = 10;
int b =0;
sum(a,b);(1)
/*
mov eax,dword ptr [b]
push eax
mov ecx,dword ptr [a]
push ecx
call sum (09A10D7h)
add esp,8
*/
sum(a); (2)
/*
push 0Ah
mov eax,dword ptr [a]
push eax
call sum (09A10D7h)
add esp,8
*/
sum(a,30); (3)
/*
push 1Eh
mov eax,dword ptr [a]
push eax
call sum (09A10D7h)
add esp,8
*/
}
从反汇编上来讲,C++支持传默认值,当(1)和(2)相比时,不给参数时节省了调用mov指令的调用,提交了效率,节省了时间。(2)(3)相比并没有区别提高效率。
编译时从上到下编译,类似
例1:int sum(int a ,int b=20);(1)
int sum(int a =10 ,int b);(2)
可以编译成功,因为在编译a时,b已经完成了编译。若(1)(2)位置互换,不能编译成功,因为默认值时要从右向左给。
例2:int sum(int a,int b=20);
int sum(int a,int b=20);
声明可以有很多个,因为声明不占内存,不产生符号。声明可以给默认值,但是一个形参只能给一次默认值,否则会产生重定义默认值错误。
2.内联函数
2.1 inline函数和宏的区别
宏是在预处理阶段进行字符替换。而inline函数在函数的调用点把函数的代码全部展开,会在编译阶段进行类型检查,更安全,所以也叫做一种更安全的宏。
2.2 inline函数和普通函数的区别
(1)内联函数没有标准的函数栈帧的开辟和回退,效率高
普通函数有
如果函数调用的开销 > 函数执行的开销
(栈帧的开辟和回退)>(此例中的return a+b)
这个时候使用内联函数更好更省时
注:inline函数一般都写在原文件中,只能在本文件可见,其他文件不能调用。也可以写在.h文件中
2.3 inline函数和static函数的区别
(1)栈帧开辟回退。static有正常的栈帧开辟和回退,inline没有
(2)符号产生。static产生符号,inline不产生符号
2.4普通函数和static函数的区别
产生符号的属性,static产生local的符号,链接器不处理。普通函数产生global的符号,链接器对其进行符号的解析=》给符号分配内存虚拟地址=》对符号进行重定位。(objdump -t main.o可查看符号表)
注:inline函数只在release版本起作用。在debug版本里,inline函数的调用也需要栈帧的开辟和回退。inline函数只是对编译器的一个建议,最终能不能处理成inline函数由编译器决定,递归函数只有在函数运行时传入实参才能知道形参是多少,编译时并不知道,也不知道要展开多少次,所以不能处理成inline函数。
3.函数重载
C语言中,函数产生符号由函数名称决定,不支持重载的函数
C++中,函数产生符号由函数名称+形参类型+形参个数决定
例:
bool campare(int a,int b)
{
cout<<"campare(int a,int b)"<<endl;
return a>b;
}
bool campare(double a,double b)
{
cout<<"campare(double a,double b)"<<endl;
return a>b;
}
bool campare(char* a,char* b)
{
cout<<"campare(char* a,char* b)"<<endl;
return a>b;
}
在C中,生成的符号都是campare,
在C++中生成的符号为compare_int_int、compare_double_double、compare_char*_char*
此外,这里可以引出静多态和动多态的区别???
静多态:函数的重载、模板
动多态:继承里的多态(虚函数)
关于函数重载:
1).函数名相同,参数列表不同(生成符号不同)的函数称作一组重载的函数,他们之间是重载的关系。不能仅通过返回值不同确定重载关系,符号的产生和返回值没关系。
2).重载必须处于同一个作用域之内才能构成重载
3).
补充:默认类型转换:
4.c/c++相互调用
extern “C”//里面内容的符号按照C语言的规则产生
{
int sum(int a,int b);
}