1. 为什么C++传参是个技术活
刚接触C++那会儿,我最头疼的就是函数传参。明明照着书上的例子写了代码,运行结果却总是不对。后来才发现,传值、传指针、传引用这三种方式,选错了轻则性能损失,重则程序崩溃。有次我写了个排序算法,用错传参方式导致排序后原数组纹丝不动,debug到凌晨三点才找到问题。
C++作为一门接近硬件的语言,传参方式直接决定了数据在内存中的流转方式。理解这三种传参机制,就像厨师要明白不同食材的处理手法——生鱼片得切薄,牛排要厚切,传参方式选错了,再好的算法也做不出"美味"的程序。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 传值:最安全也最"费劲"的拷贝
2.1 基本工作机制
传值(pass by value)是C++中最直接的传参方式。当调用func(a)时,实参a的值会被完整复制到形参的内存空间。这个过程中会发生:
- 在栈上为形参分配新内存
- 将实参的值按位拷贝到形参
- 函数内所有操作都作用于这个副本
cpp复制void increment(int x) {
x++;
}
int main() {
int a = 5;
increment(a);
cout << a; // 输出仍然是5
}
2.2 适用场景与性能考量
适合场景:
- 基本数据类型(int、float等)
- 函数不需要修改原数据
- 对象很小(<= 8字节)
性能陷阱:
cpp复制struct BigData {
int data[1000];
};
void process(BigData bd) { ... } // 每次调用都会拷贝4000字节
经验法则:当拷贝开销大于30个时钟周期(约10ns)时,考虑改用引用或指针
2.3 常见坑点实录
- 误以为能修改原值(如上面的increment例子)
- 对象拷贝构造函数被意外调用
- 多线程环境下,传值可能引发虚假共享(false sharing)
3. 传指针:C语言的遗产,双刃剑
3.1 指针传参的本质
传递的是变量地址的拷贝,通过解引用操作符*访问原始数据。关键特点:
- 形参是指针变量(存储地址)
- 实参必须取地址(&操作符)
- 函数内通过指针间接操作原数据
cpp复制voi
