2023-01-15 17:32:55
结构体作为函数参数传递时,值传递会复制整个结构体,而引用传递仅传递地址。两者性能差异显著,具体选择需结合结构体大小、修改需求及安全性要求综合考量。

结构体较小(如仅含几个int或float成员),复制开销可忽略。
需创建独立副本时(如函数内部修改副本而不影响原始数据)。
实现纯函数(无副作用),确保函数行为可预测。
示例代码(值传递性能测试):
#include <iostream>#include <chrono>struct BigStruct { double data[1000]; };void valuePass(BigStruct s) { s.data[0] = 1.0; }int main() { BigStruct myStruct; auto start = std::chrono::high_resolution_clock::now(); for (int i = 0; i < 100000; ++i) valuePass(myStruct); auto end = std::chrono::high_resolution_clock::now(); auto duration = std::chrono::duration_cast<std::chrono::microseconds>(end - start); std::cout << "Value Pass Time: " << duration.count() << " microseconds" << std::endl; return 0;}引用传递的性能优势结构体较大(如包含数组或复杂数据结构),需优化性能。
函数需修改结构体内容(或通过指针间接修改)。
示例代码(引用传递性能测试):
#include <iostream>#include <chrono>struct BigStruct { double data[1000]; };void referencePass(BigStruct& s) { s.data[0] = 1.0; }int main() { BigStruct myStruct; auto start = std::chrono::high_resolution_clock::now(); for (int i = 0; i < 100000; ++i) referencePass(myStruct); auto end = std::chrono::high_resolution_clock::now(); auto duration = std::chrono::duration_cast<std::chrono::microseconds>(end - start); std::cout << "Reference Pass Time: " << duration.count() << " microseconds" << std::endl; return 0;}对比结果:引用传递在处理大型结构体时性能显著优于值传递。
何时选择值传递?
理解值传递与引用传递的语义差异,结合实际需求选择合适方式,可显著提升代码效率与安全性。