c++编译器优化不显示拷贝构造函数

一.错误情景(无法打印拷贝函数)

cpp 复制代码
#include<iostream>
using namespace std;

class person
{
public:
	person()
	{
		cout << "person默认构造函数调用" << endl;
	}

	person(int age)
	{
		cout << "有参构造函数调用" << endl;
	}

	
	person(const person& p)
	{
		cout << "拷贝构造函数调用" << endl;
	}

	~person()
	{
		cout << "析构函数调用" << endl;
	}


private:
	int m_Age;
};


person dowork2()
{
	person p1;
	return p1;
}

void test03()
{
	person p = dowork2();
}

int main()
{

	test03();
	
	return 0;
}
  • 错误运行结果如下:

    通过代码分析test03调用dowork2,dowork2中person p1会调用一次默认构造函数,而return p1会调用拷贝构造函数,dowork2结束后,p1是局部变量,会被析构掉,所以会调用一次析构函数,来到test03中,person p=dowork2()创建对象会调用拷贝构造函数。这里根据编译器优化的不同其实dowork2()有可能产生临时变量,后面就是对p的析构。

二.未达预期的原因(编译器优化问题)

原因:拷贝构造函数没有被调用的原因可能是因为编译器进行了优化,如返回值优化(RVO)或移动语义。这种优化可能会导致拷贝构造函数被省略掉,所以看不到相关的输出信息。

解决方法:要强制确保拷贝构造函数被调用,可以尝试关闭编译器的优化选项。具体方法取决于您使用的编译器和开发环境。

  1. 如果使用GCC编译器可以通过在编译时添加-fno-elide-constructors参数来禁用返回值优化。
  • source.cpp是你的源文件,output是输出文件
cpp 复制代码
g++ -fno-elide-constructors -o output source.cpp

2.G++编译器也相同,这种方法是--禁止特定类型的优化

cpp 复制代码
g++ -fno-elide-constructors -o output source.cpp
  • 运行结果如下:
相关推荐
楚Y6同学30 分钟前
QT C++ 实现图像查看器
开发语言·c++·qt·图像查看
郝学胜-神的一滴1 小时前
Qt6 + OpenGL 3.3 渲染环境搭建全指南:从空白窗口到专属渲染画布的优雅实现
数据结构·c++·线性代数·算法·系统架构·图形渲染
样例过了就是过了1 小时前
LeetCode热题100 最小栈
数据结构·c++·算法·leetcode
计算机安禾1 小时前
【数据结构与算法】第18篇:数组的压缩存储:对称矩阵、三角矩阵与稀疏矩阵
c语言·开发语言·数据结构·c++·线性代数·算法·矩阵
今儿敲了吗1 小时前
51| 八皇后
c++·笔记·学习·算法·深度优先
玖釉-1 小时前
暴力美学与极致性能:深度解析 Meshoptimizer 的 Sloppy 减面算法
c++·windows·图形渲染
Darkwanderor1 小时前
搜索优化——迭代加深dfs
c++·算法·深度优先·迭代加深
每天回答3个问题2 小时前
LeetCodeHot100|对称二叉树、二叉树的直径、二叉树的层序遍历
数据结构·c++·ue4·
nianniannnn2 小时前
力扣 3.无重复字符的最长子串
c++·算法·leetcode
羊小猪~~2 小时前
【QT】-- 模型与视图简介
开发语言·数据库·c++·后端·qt·前端框架·个人开发