赞
踩
使用内联函数可以减少函数栈帧的开销。
- Swap(a, b);
- 00A516C8 mov eax,dword ptr [a]
- 00A516CB mov dword ptr [ebp-20h],eax
- 00A516CE mov ecx,dword ptr [b]
- 00A516D1 mov dword ptr [a],ecx
- 00A516D4 mov edx,dword ptr [ebp-20h]
- 00A516D7 mov dword ptr [b],edx
内联函数会在调用它的地方展开。(展开及不会call 函数名)
- inline void Swap(int& x, int& y)
- {
- int tmp = x;
- x = y;
- y = tmp;
- }
- int main()
- {
- int a = 1, b = 2;
- Swap(a, b);
- cout << a << b << endl;
- return 0;
- }
1. inline是一种以空间换时间的做法,省去调用函数额开销。所以代码很长或者有循环/递归的函数不适宜 使用作为内联函数。
2. inline对于编译器而言只是一个建议,编译器会自动优化,如果定义为inline的函数体内有循环/递归等 等,编译器优化时会忽略掉内联。
3. inline不建议声明和定义分离,分离会导致链接错误。因为inline被展开,就没有函数地址了,链接就会 找不到。
在 Visual Studio 中查看反汇编代码_vs2022反汇编-CSDN博客https://blog.csdn.net/qq_27843785/article/details/107189963内联函数如果超过30行左右编译器会自动去除内联。
1. 常量定义 换用const
2. 函数定义 换用内联函数
- // 此处代码编译失败,auto不能作为形参类型,因为编译器无法对a的实际类型进行推导
- void TestAuto(auto a)
- {}
- void TestAuto()
- {
- int a[] = {1,2,3};
- auto b[] = {4,5,6};
- }
使用范围for 的前提:数组 数组的指针不行(void TestFor(int array[]) )
- void TestFor()
- {
- int array[] = { 1, 2, 3, 4, 5 };
- for(auto& e : array)
- e *= 2;
-
- for(auto e : array)
- cout << e << " ";
-
- return 0;
- }
NULL实际是一个宏,在传统的C头文件(stddef.h)中,可以看到如下代码:
- #ifndef NULL
- #ifdef __cplusplus
- #define NULL 0
- #else
- #define NULL ((void *)0)
- #endif
- #endif
gcc -E test.c -o test.i
- #include<stdio.h>
- #define MAX(x,y) ((x)>(y)?(x):(y))
- int main()
- {
- int a=1,b=2;
- int m=MAX(a,b);
- printf("MAX: %d\n",m);
- return 0;
- }
- int main()
- {
- int a=1,b=2;
- int m=((a)>(b)?(a):(b));
- printf("MAX: %d\n",m);
- return 0;
- }
gcc: fatal error: no input files compilation terminated.
Makefile:2: *** missing separator. Stop.
- test:test.c
- gcc -o $@ $^
- .PHONY:clean
- clean:
- rm -f test
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。