首页 > 其他分享 >copy elision

copy elision

时间:2024-02-08 23:45:37浏览次数:25  
标签:调用 Copy elision constructor copy called 构造函数

copy elision是指编译器为了优化,将不需要的copy操作直接省略了。比如函数返回值的copy操作和构造函数的copy操作等。

例子如下

#include<iostream>
using namespace std;
class A{
    public:
    A(){
        cout<<"default Constructor called"<<endl;
    }
    A(const A &a){
        cout<<"Copy constructor called"<<endl;
    }
    A& operator=(const A &a) {
        cout<<"Assignment operator called"<<endl;
        return *this;
    }
    // explicit A(int a){
    //     cout<<"Parameterized constructor called"<<endl;
    // }
    A(int a){
        cout<<"Parameterized constructor called"<<endl;
    }
};
A foo(){
    return A();
}
A bar(){
    A a;
    return a;
}
int main(){
    A a(1);
    A b = 1;
    A c = foo(); 
    A d = bar();
    return 0;
}

copy elision发生在

  • a 直接调用值构造函数创建A,省略了copy操作
  • b 直接调用值构造函数创建A,省略了copy操作
  • c 直接调用默认构造函数创建A,省略了2次copy操作
  • d 直接调用默认构造函数创建A,省略了2次copy操作

默认编译选项的输出为

Parameterized constructor called
Parameterized constructor called
default Constructor called
default Constructor called

如果加上-fno-elide-constructors编译选项,输出为

Parameterized constructor called
Parameterized constructor called
Copy constructor called
default Constructor called
Copy constructor called
Copy constructor called
default Constructor called
Copy constructor called
Copy constructor called

在使用copy elision时,初始化=和()效果是一样的,都会只调用构造函数,但=的实际含义是隐式调用值构造函数,然后调用拷贝构造函数,而()的实际含义是直接调用构造函数。

标签:调用,Copy,elision,constructor,copy,called,构造函数
From: https://www.cnblogs.com/wangerblog/p/18012246

相关文章

  • 并发容器【ConcurentHashMap、CopyOnWriteArrayList、阻塞队列、ArrayBlockingQueue】
    (并发容器)转自极客时间什么是并发容器?在JUC包中,有一大部分是关于并发容器的,如ConcurrentHashMap,ConcurrentSkipListMap,CopyOnWriteArrayList及阻塞队列。这里将介绍使用频率、面试中出现频繁的最高的ConcurrentHashMap和阻塞队列。注意:这里说到的容器概念,相当于我们理解中......
  • MIT 6.1810 Lab: Copy-on-Write Fork for xv6
    lab网址:https://pdos.csail.mit.edu/6.828/2022/labs/cow.htmlxv6Book:https://pdos.csail.mit.edu/6.828/2022/xv6/book-riscv-rev3.pdfImplementcopy-on-writefork这部分需要我们实现写时拷贝,题目给出解决方案为,当fork时,将父子进程的页表项都设置为只度,当发生写错误时,在处......
  • Docker:Failed to copy files, no space left on device
    主页个人微信公众号:密码应用技术实战个人博客园首页:https://www.cnblogs.com/informatics/问题描述在Mac上进行docker构建时,偶尔会遇到以下问题Failedtocopyfiles:userspacecopyfailed:write/var/lib/docker/volumes/xxx/_data/xxx.dbf:nospaceleftondevice......
  • Linux基础47 Ansible之ad-hoc, 命令模块(command, shell, script), 软件管理模块(yum,
    Ansible之ad-hoc一、什么是ad-hoc1.什么是ad-hocad-hoc简而言之就是“临时命令”,执行完即结束,并不会保存2.ad-hoc使用场景可以用作查看远程机器的进程,或者磁盘,或者拷贝文件3.ad-hoc命令使用[root@m01~]#ansibleweb01-mshell-a'free-m'web01|CHANGED|rc=......
  • const copyStories = [...stories] 和 let storiesToDisplay = stories.slice(); 两
    constcopyStories=[...stories]和letstoriesToDisplay=stories.slice();两种复制数组的方式,哪种更优雅?在JavaScript中,constcopyStories=[...stories](使用扩展运算符)和letstoriesToDisplay=stories.slice()都可以用来复制数组,并且都能生成一个新的数组。这两种......
  • Additional Information for Homogeneous System Copy on SAP HANA with Encrypted Ba
    SymptomAdditionalinformationwhenexecutingahomogeneoussystemcopyforanSAPsystemonSAPHANAwhenthedatabackupisencrypted.Ifadatarecovery stepperform_database_recovery_tenantfailswitherror:  SAPDBTechJDBC:[448]:recoverycouldnot......
  • Adobe InCopy 2024 v19.1 (macOS, Windows) - 编写和副本编辑软件
    AdobeInCopy2024v19.1(macOS,Windows)-编写和副本编辑软件Acrobat、AfterEffects、Animate、Audition、Bridge、CharacterAnimator、Dimension、Dreamweaver、Illustrator、InCopy、InDesign、LightroomClassic、MediaEncoder、Photoshop、PremierePro、AdobeXD......
  • BeanUtils 的 copyProperties 踩坑记录
    代码示例importorg.apache.commons.beanutils.BeanUtils;publicclassTestBeanUtils{publicstaticvoidmain(String[]args)throwsException{testApacheBeanUtils();testSpringBeanUtils();}privatestaticvoidtestSpringBeanUtil......
  • C++:GDAL中CreateCopy()函数生成的栅格图像如何修改波段数?
      本文介绍基于C++语言GDAL库,为CreateCopy()函数创建的栅格图像添加更多波段的方法。  在C++语言的GDAL库中,我们可以基于CreateCopy()函数与Create()函数创建新的栅格图像文件。其中,CreateCopy()函数需要基于一个已有的栅格图像文件作为模板,将模板文件的各项属性信息(例如空......
  • 11-K8 Service:轻松搞定服务发现和负载均衡 (copy)
    经过前面几节课的学习,我们已经可以发布高可用的业务了,通过PV持久化地保存数据,通过Deployment或Statefulset这类工作负载来管理多实例,从而保证服务的高可用。想一想,这个时候如果有别的应用来访问我们的服务的话,该怎么办呢?直接访问后端的PodIP吗?不,这里我们还需要做服务发现(S......