值传递实现
#include <iostream>
#include <vector>
struct LargeStruct {
std::vector<int> data;
// 假设还有很多其他成员变量
LargeStruct() {
for (int i = 0; i < 10000; ++i) {
data.push_back(i);
}
}
};
void processLargeStruct(LargeStruct largeStruct) {
// 这里对largeStruct进行一些处理,比如计算data的总和
int sum = 0;
for (int num : largeStruct.data) {
sum += num;
}
std::cout << "Sum: " << sum << std::endl;
}
引用传递实现
void processLargeStruct(LargeStruct& largeStruct) {
// 这里对largeStruct进行一些处理,比如计算data的总和
int sum = 0;
for (int num : largeStruct.data) {
sum += num;
}
std::cout << "Sum: " << sum << std::endl;
}
性能优势分析
- 减少内存开销:
- 值传递:每次调用
processLargeStruct
函数时,都会创建 LargeStruct
结构体的一个副本。由于 LargeStruct
包含大量成员变量(这里以 std::vector<int>
为例,假设数据量很大),创建副本会消耗大量的内存。例如,如果 LargeStruct
占用100KB内存,每次函数调用时值传递都要额外分配100KB内存来存储副本。
- 引用传递:引用传递只是传递了结构体的地址,无论
LargeStruct
结构体多大,传递的地址占用空间通常是固定的(例如在64位系统中地址为8字节),大大减少了内存开销。
- 提高运行效率:
- 值传递:创建副本的过程涉及到内存的分配和数据的复制,这会消耗一定的时间。对于包含大量成员变量的
LargeStruct
结构体,数据复制的时间开销会很明显。在多次调用 processLargeStruct
函数时,这个时间开销会累积起来,导致程序运行效率降低。
- 引用传递:由于不需要创建副本,避免了数据复制的时间开销,在多次调用
processLargeStruct
函数时,能够显著提高程序的运行效率。特别是在实时性要求较高或者对性能敏感的应用场景中,这种性能提升更为关键。