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 = c
、type ci5 = typec
和 type 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++:如果没有对这些不同的创建/初始化、复制、分配方式进行优化,输出是啥?的主要内容,如果未能解决你的问题,请参考以下文章