C++ 函数返回对象时并没有调用拷贝构造函数

#include <iostream>
#include <vector>
#include <string.h>

using namespace std;

class CTest {
public:
    CTest() {
        cout << "CTest construct" << endl;
        data = new char[10];
        strncpy(data, "hello", 10);
    }   

    CTest(const CTest& test) {
        cout << "copy contruct" << endl;
        data = new char[10];
        memcpy(data, test.data, 10);
    }   

    ~CTest() {
        cout << "CTest destruct" << endl;
        delete data;
        data = NULL;
    }   

public:
        char *data;
};

CTest GetTest() {
    CTest test;
    return test;
}

int main(int argc, char** argv) {

    GetTest();
    return 0;
}

执行结果如下:

并没有进行对象拷贝操作,与预期不符,Why?

其原因是:RVO(return value optimization),被G++进行值返回的优化了,具体的RVO的相关技术,可以进行百度。

我们可以将RVO优化关闭,可以对g++增加选项-fno-elide-constructors,重新编绎之后,

执行结果如下:

转载自:https://blog.csdn.net/dreamvyps/article/details/79154321

原文地址:https://www.cnblogs.com/fuao2000/p/11018924.html

时间: 2024-08-29 15:39:59

C++ 函数返回对象时并没有调用拷贝构造函数的相关文章

利用无名对象初始化对象系统不会调用拷贝构造函数

#include <iostream> using namespace std; class Internet { public: Internet(char *name,char *address) { cout<<"载入构造函数"<<endl; strcpy(Internet::name,name); } Internet(Internet &temp) { cout<<"载入COPY构造函数"<&l

条款21:必须返回对象时,别妄想返回其reference

条款21:必须返回对象时,别妄想返回其reference 引用只是对象的一种别名当使用引用的时候,请确认他的另一个身份在哪? class Rational { public: Rational(int x, int y) : m_x(x), m_y(y){} //返回const是属于类型保护,friend修饰,以后条款详说 friend const Rational operator + (const Rational &lhs, const Rational &rhs) { Ration

Effective C++:条款21:必须返回对象时别妄想返回其reference

(一) 一定要避免传递一些references去指向其实并不存在的对象. 看下面这个类: class Rational { public: Rational(int numerator = 0, int denominator = 1); private: int n, d; friend const Rational operator*(const Rational& lhs, const Rational& rhs); }; 这个函数不能返回引用, (二)在stack中分配local对

Item 21:需要返回对象时,不要返回引用 Effective C++笔记

Item 21: Don't try to return a reference when you must return an object Item 20中提到,多数情况下传引用比传值更好.追求这一点是好的,但千万别返回空的引用或指针. 一个典型的场景如下: class Rational{ int n, d; public: Raitonal(int numerator=0, int denominator=1); }; // 返回值为什么是const请参考Item 3 friend con

C++什么时候调用拷贝构造函数和什么时候调用构造函数

拷贝构造函数 都是在什么情况下调用??? /* ** 什么时候调用拷贝构造函数 ** */ #include <iostream> using namespace std; //日期类 class Date{ public: int year,month,day; Date(){//无参构造 cout << "日期类的构造函数" << endl; } ~Date(){ cout << "日期的析构函数" <<

C++类构造优化 - 不调用拷贝构造函数

假如有下面这样一个类: class A{ public: A(int p, char q):x(p), c(q){ cout << "constructor called" << endl; } A(const A& a){x = a.x; c = a.c; cout << "copy constructor called" << endl;} ~A(){cout << "destruct

对象做函数参数和函数返回值时,调用复制构造函数,构造函数,析构函数的情况

// 对象做函数参数和返回值.cpp : 定义控制台应用程序的入口点.//exit(0)表示正常退出程序,exit(0)表示异常退出 //在调用input时,编译器用对象A去创建了形参对象temp,调用了复制构造函数,对象A中的数据复制给了对象temp// 在input函数中,执行temp.set(s),为对象temp中数据成员str申请了动态储存空间,并设置了输入的字符串//并没有改变实参A中的数据成员str的储存空间,故在执行语句A.show()后输出的字符串并没有改变.在函数调用结束后 /

[021]必须返回对象时,别妄想返回其reference

引言 在条目20中,我们知道了值传递和引用传递的效率问题,因此在设计程序时,我们可能就尽可能来返回引用而不是值. 可是,可能会犯下面的一些错误:传递一些引用指向其实并不存在的对象. 第一节:返回临时变量的引用 假如我们有以下的例子,先看值传递 1 class A { 2 public: 3 A(int n = 0, int d = 1):n(n),d(d) {} 4 private: 5 int n,d; 6 friend const A operator* (const A& l, const

条款21: 必须返回对象时,别妄想返回其reference

总结: 绝不要返回一个local栈对象的指针或引用:绝不要返回一个被分配的堆对象的引用:绝不要返回一个局部对象有可能同时需要多个这样的对象的指针或引用. 条款4中给出了“在单线程环境中合理返回局部静态对象的引用” 提出问题 一旦程序员抓住对象传值的效率隐忧,很多人就会一心一意根除传值的罪恶.他们不屈不挠地追求传引用的纯度,但他们全都犯了一个致命的错误:传递不存在的对象的引用.考虑一个用以表现有理数的类,包含一个函数计算两个有理数的乘积: class Rational { public: Rati