C++:如果没有对这些不同的创建/初始化、复制、分配方式进行优化,输出是啥?

Posted

技术标签:

【中文标题】C++:如果没有对这些不同的创建/初始化、复制、分配方式进行优化,输出是啥?【英文标题】:C++: What is the output, if no optimizations are applied to these different ways to create/initialize, copy, assign?C++:如果没有对这些不同的创建/初始化、复制、分配方式进行优化,输出是什么? 【发布时间】:2021-10-16 08:03:46 【问题描述】:

我发现变量的构造、复制、分配方式有些混乱,因为在我尝试过的编译器中,它们通常会应用某种优化(删除临时等)。

我在下面的 cmets 中列出了我尝试过的不同方法以及我的程序的输出。可能其中一些包括临时对象创建但被编译器优化掉了?请说明输出是否按照标准正确,如果未应用优化,输出是什么。

#include <iostream>
using namespace std;

class type 
    public:
    type(int z)cout << "ctor"<<endl;;
    type(const type&)cout<<"copy"<<endl;
    void operator=(const type& )cout <<"assign"<<endl;
;
int main()

//constructor
type c(8);         //ctor 
type c28;        //ctor 
type c3 = 8;       //ctor  
type c4 = 8;     //ctor
type c5 = type(8); //ctor
type c6 = type8; //ctor
cout <<endl; 

//copy 
type ci0(c);        //copy
type ci1c;        //copy
type ci2 = c;       //copy
type ci3 = c;     //copy
type ci4 = type(c); //copy
type ci5 = typec; //copy
cout <<endl;

//assign
c2 = c;        //assign
c2 = c;      //assign
c2 = typec;  //copy and then assign
c2 = type(c);  //copy and then assign
c2 = 8;        //ctor and then assign
c2 = 8;      //ctor and then assign
c2 = type(8);  //ctor and then assign
c2 = type8;  //ctor and then assign

【问题讨论】:

您还可以使用以下方法创建对象的副本:type ci4 = ctype ci5 = typectype ci6 = type(c) 您标记为副本的大部分内容不是副本,而仅仅是构造函数。而你的有线电视演员中的一些在技术上是演员,然后是分配。但是编译器我 @Joe 标记为copy 的所有 3 行都会调用复制构造函数,那么您想说什么? 请尽量集中问题。您正在询问一组非常大且包含许多特殊情况的功能。以目前的形式,我认为这个问题不合适。是否有一些您不清楚的具体案例? 对不起,我的评论在我完成之前无意中发布了。我建议阅读左值和右值之间的差异。今天,识别 r 值的编译器可以优化过去的构造,然后赋值为简单的构造 【参考方案1】:

使用显式到 ctor 和复制 ctor 并删除每个函数,我能够得到以下结果。

//constructor
type c(8);         //explicit ctor 
type c28;        //explicit ctor 
type c3 = 8;       //implicit ctor, explicit copy  
type c4 = 8;     //implicit ctor
type c5 = type(8); //explicit ctor, implicit copy
type c6 = type8; //explicit ctor, implicit copy
cout <<endl; 

//copy 
type ci0(c);        //explicit copy
type ci1c;        //explicit copy
type ci2 = c;       //implicit copy
type ci3 = c;     //implicit copy
type ci4 = type(c); //implicit copy
type ci5 = typec; //implicit copy
cout <<endl;

//assign
c2 = c;        //assign
c2 = c;      //assign
c2 = typec;  //implicit copy and then assign
c2 = type(c);  //implicit copy and then assign
c2 = 8;        //implicit ctor and then assign
c2 = 8;      //implicit ctor and then assign
c2 = type(8);  //explicit ctor and then assign
c2 = type8;  //explicit ctor and then assign

【讨论】:

以上是关于C++:如果没有对这些不同的创建/初始化、复制、分配方式进行优化,输出是啥?的主要内容,如果未能解决你的问题,请参考以下文章

C++ 对象创建和构造函数

C++学习 之pair

c++之pair

c++之pair

SQLserver 2008同步复制创建后新增表/函数/存储过程(不重新初始化快照)

C++调用父类的构造函数规则