当前位置: 首页 > news >正文

C++拷贝构造函数初级解析:设计要点、调用机制与性能优化实践

目录

1. 拷贝构造函数的形参类型

关键要点:

2. 拷贝构造函数的调用次数分析

示例代码分析

运行结果与解析

调用次数原理

3. 减少拷贝构造次数的优化方法

优化策略

优化效果对比

总结


1. 拷贝构造函数的形参类型

关键要点:

  1. 必须使用引用类型
    错误形式:Int(Int it)
    会导致无限递归:当形参被赋值时,会再次触发拷贝构造函数调用。

  2. 正确形式:const引用
    Int(const Int &it)

    • 作用1:防止在拷贝过程中意外修改原对象

    • 作用2:允许接受常对象(const Int)作为参数,避免编译错误

示例说明:

class Int {
public:
 Int(const Int &it); // 正确写法
};

2. 拷贝构造函数的调用次数分析

示例代码分析

class Int
{
private:
	int value;
public:
	Int() :value() { cout << "Creat:" << value << " " << this << endl; }
	Int(int x) :value(x) { cout << "Creat:" << value << " " << this << endl; }
	~Int() { cout << "Destory:" << value << " " << this << endl; }
	void Print() const
	{
		cout << "value:" << value << endl;
	}
	void SetValue(int x)
	{
		value = x;
	}
	Int(const Int& it)
	{
		value = it.value;
		cout << "copy" << endl;
	}
};
Int func(Int c) {
    c.SetValue(100);
    return c;
}
int main() {
    Int a(10);   // 构造a
    Int b;       // 默认构造b
    b = func(a); // 调用func
}

运行结果与解析

Creat:10 0073FD0C       // 构造a
Creat:0 0073FD00        // 构造b
copy0073FC08            // 第一次拷贝:a→形参c
copy0073FC28            // 第二次拷贝:返回值→将亡值
Destory:100 0073FC08    // 析构形参c
Destory:100 0073FC28    // 析构将亡值
Destory:100 0073FD00    // 析构b
Destory:10 0073FD0C     // 析构a

调用次数原理

调用场景触发原因
第一次拷贝构造函数调用func(a)时,值传递形参c需通过拷贝构造从a创建
第二次拷贝构造函数返回时,需通过拷贝构造创建将亡值(临时对象),用于给b赋值

将亡值(expiring value):函数返回值时,若返回值类型非引用且大小超过寄存器容量,编译器会在主调函数栈帧中创建临时对象存储返回值。


3. 减少拷贝构造次数的优化方法

优化策略

  1. 函数形参使用引用传递
    将形参改为const Int &c,避免值传递时的拷贝构造调用。

    Int func(const Int &c) {  // 优化后
        Int tmp = c;          // 仅此处触发一次拷贝构造
        tmp.SetValue(100);
        return tmp;
    }

  2. 返回不具名对象(直接构造返回值)
    通过直接返回构造的临时对象,避免中间拷贝过程。

    Int Add(const Int &a, const Int &b) {
        return Int(a.value + b.value);  // 直接构造亡值,无额外拷贝
    }

优化效果对比

场景原调用次数优化后调用次数
调用func(a)2次0次(形参引用)
返回表达式直接构造对象1次0次(移动语义)

总结

  1. 拷贝构造函数的形参必须为const引用

    • 避免无限递归和常对象传递问题

  2. 拷贝构造触发场景

    • 值传递函数参数时

    • 返回非引用类型对象时

  3. 优化方法

    • 函数参数优先使用const &

    • 返回值时直接构造不具名对象,利用返回值优化(RVO)或移动语义(C++11+)

关键实践:在函数设计和返回值处理时,优先考虑引用传递和直接构造对象,可显著减少不必要的拷贝开销。

相关文章:

  • 【NLP】文本预处理
  • ArrayList
  • 【第13章:自监督学习与少样本学习—13.3 自监督学习与少样本学习在图像识别、语言理解等领域的应用探索】
  • 网络安全学习笔记之Internet基本知识
  • 服务器A到服务器B免密登录
  • 哈希动态规划dp_5
  • 《探秘Windows 11驱动开发:从入门到实战》
  • FreeRTOS第1篇:FreeRTOS的“内核心脏”——任务管理机制
  • 2025 N1CTF crypto 复现
  • 微信小程序image组件mode属性详解
  • HTML之JavaScript对象
  • 【JVM系列】谈一谈JVM调优
  • ubuntu系统下KVM设置桥接网络(失败)
  • UE5.3 C++ 通过Spline样条实现三维连线,自己UV贴图。
  • MongoDB:listDatabases failed : not master and slaveOk=false
  • WPF-APP全局生命周期事件
  • RocketMq中RouteInfoManger组件的源码分析
  • 【java】作业1
  • Ai知识点总结
  • 每日一题——不同路径的数目与矩阵最小路径和
  • 体坛联播|双杀阿森纳,巴黎晋级欧冠决赛对阵国际米兰
  • 央行:将支持资本市场两项货币政策工具的额度合并使用
  • 呼和浩特65户业主被一房两卖,十年诉讼却难胜
  • 百亿基金经理调仓路径曝光,张坤、陈皓、胡昕炜又有新动作
  • 综合治理食品添加剂滥用问题,国务院食安办等六部门联合出手
  • 中标多家学校采购项目的App查成绩需付费?涉事公司回应