惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Y
Y Combinator Blog
P
Palo Alto Networks Blog
阮一峰的网络日志
阮一峰的网络日志
博客园_首页
Last Week in AI
Last Week in AI
Blog — PlanetScale
Blog — PlanetScale
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
J
Java Code Geeks
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - Franky
The Cloudflare Blog
I
Intezer
P
Privacy International News Feed
C
Check Point Blog
C
CERT Recently Published Vulnerability Notes
Apple Machine Learning Research
Apple Machine Learning Research
H
Hackread – Cybersecurity News, Data Breaches, AI and More
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
The Hacker News
The Hacker News
B
Blog
Latest news
Latest news
小众软件
小众软件
Engineering at Meta
Engineering at Meta
Cyberwarzone
Cyberwarzone
Project Zero
Project Zero
P
Proofpoint News Feed
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
S
Schneier on Security
美团技术团队
G
GRAHAM CLULEY
博客园 - 司徒正美
T
Threatpost
D
Darknet – Hacking Tools, Hacker News & Cyber Security
博客园 - 叶小钗
C
Cisco Blogs
MongoDB | Blog
MongoDB | Blog
人人都是产品经理
人人都是产品经理
博客园 - 三生石上(FineUI控件)
H
Help Net Security
Simon Willison's Weblog
Simon Willison's Weblog
Cisco Talos Blog
Cisco Talos Blog
K
Kaspersky official blog
NISL@THU
NISL@THU
AWS News Blog
AWS News Blog
T
Threat Research - Cisco Blogs
月光博客
月光博客
Security Latest
Security Latest
Scott Helme
Scott Helme
T
Tenable Blog

博客园 - 程鑫

Harness Engineering 介绍与最佳实践 Thriving in a Crowded and Changing World: C++ 2006–2020 读后总结 C++20中对于并发方面的进步 ClickHouse性能调优 - 当磁盘IO是瓶颈的时候 手撸一个C++迭代器 ClickHouse的向量处理能力 STL库的ranges ClickHouse中的各种设置 OLAP与数据仓库和数据湖 mmap访问内存方式 关于ClickHouse的一些小技巧 `static_cast` caution ClickHouse中“大列”造成的JOIN的内存超限问题 ClickHouse的JOIN算法选择逻辑以及auto选项 ClickHouse的Join算法 一种高效且节约内存的聚合数据结构的实现 “过早优化是万恶之源”这句话的源头 ClickHouse的WITH-ALIAS是如何实现的 如何与chatgpt共存 多线程与同步
C++编译器选择是否自动生成代码的背后逻辑
程鑫 · 2022-05-10 · via 博客园 - 程鑫

C++编译器选择是否自动生成代码的背后逻辑

编译器会为class和struct(实际上两者在C++中是一回事)自动生成构造函数、赋值操作符函数和析构函数。如果不是这样,那么开发者就必须自己写一些枯燥冗余的代码。然而编译器并不总是生成这些默认代码,当它觉得它无法生成正确的代码时,它就会拒绝生成默认代码。在以下几种情况中,编译器会认为它无法生成正确的代码:

  1. 当开发者自己定义了构造函数时

    编译器会认为开发者想要自己定义默认构造函数(即无参数的构造函数),它无法猜测开发者的想法,因此不会再自动生成默认构造函数。

  2. 当开发者自己定义了移动构造函数时

    编译器认为开发者可能希望仅使用移动语义而禁止拷贝,所以拷贝构造和拷贝赋值都不再自动生成。移动赋值也不会自动生成,而是交给开发者自己来定义,因为开发者已经在定义移动语义了。

  3. 当开发者自己定义了移动赋值操作函数时

    同上原因,拷贝构造和拷贝赋值不再默认生成。同样的原因,移动构造函数也不会自动生成。

  4. 当开发者自己定义了拷贝构造函数

    编译器认为开发者已经自己定义了拷贝语义,无法保证能自动生成正确的移动语义的代码,所以不再自动生成此类代码。C++11标准规定也不要自动生成拷贝赋值操作符函数代码,因为用户接管了拷贝语义的定义,但是Visual Studio仍然会生成拷贝赋值操作符函数代码。

  5. 当开发者自己定义了拷贝赋值操作函数时

    同上原因,不再生成移动语义的代码。C++11标准规定也不要自动生成拷贝构造函数代码,因为用户接管了拷贝语义的定义,但是Visual Studio仍然会生成拷贝构造函数代码。

  6. 当开发者自己定义了析构函数时

    移动构造和移动赋值都涉及到资源从源对象移动到目标对象,对于源对象来说是释放了对资源的所有权。而析构函数是释放资源,所以既然用户自己定义了用于释放资源目的的析构函数,那么说明移动的语义无法保持默认的实现,因此编译器不再自动生成移动语义的代码。

  7. 当开发者自己定义了虚析构函数时

    编译器不再自动生成默认析构函数代码。