inline函数与宏函数
在 c/c++ 中,为了解决一些频繁调用的小函数大量消耗栈空间(栈内存)的问题,特别的引入了 inline 修饰符,表示为内联函数。
inline不是强制的,编译器可以对它置之不理。例如,递归函数通常不会被编译为inline函数,编译器有权决定是否将声明为inline的函数编译为inlin
栈空间就是指放置程序的局部数据(也就是函数内数据)的内存空间。
#include <iostream>
using namespace std;
#define MAX_MACRO(a, b) (a) > (b) ? (a) : (b)
#define MAX_MACRO2(a, b) a > b ? a : b
inline int max_function(int a, int b){
return a>b ? a: b;
}
int main(){
int num1 = 20;
int num2 = 30;
int maxv = max_function(num1, num2);
cout << maxv<< endl;
// 1.用宏定义没有函数调用的代价
maxv = MAX_MACRO(num1, num2);
cout << maxv<<endl;
// 2.但是宏函数有其他的坑,比如重复计算的问题
// 注意:这里预期返回max(20, 30) = 30
maxv = MAX_MACRO(num1++, num2++);
cout << maxv<<endl;
cout << num1<<endl;
cout << num2<<endl;
// 解释:这是因为宏替换的时候实际是:
// (a) > (b) ? (a) : (b)
// (num1++) > (num2++) ? (num1++) : (num2++)
// (20++) > (30++) ? (21++) : (31++)
// return 31, num1 = 21(没执行), num2 = 32
cout << "----------------------"<<endl;
// 这一预期返回max(20, 30) = 30
num1 = 20, num2 = 30;
maxv = max_function(num1++, num2++);
cout << maxv<<endl;
cout << "----------------------"<<endl;
// 3.又比如如果对宏参数不加括号,会受到优先级顺序的影响
num1 = 0xAB09;
num2 = 0xEF08;
maxv = MAX_MACRO2(num1&0xFF, num2&0xFF);
// cout<<hex;
cout<<"eg3"<<endl;
cout<<maxv<<endl;
cout<<num1<<endl;
cout<<num2<<endl;
cout << "----------------------"<<endl;
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)