C++自定义myIterator迭代器变量构造赋值机制疑问
现象原因
你观察到拷贝构造函数未被调用,是C编译器的返回值优化(RVO,即返回值消除) 机制导致的,这是C标准允许(C++17及之后版本为强制要求)的拷贝省略优化规则。
itr的完整构造流程
未优化的逻辑下,list::myIterator itr=l.begin(); 本来应该执行两次构造:
- 第一步:在
begin()函数的栈帧内,执行myIterator(this->head),调用普通构造函数生成一个临时的myIterator对象 - 第二步:用这个临时对象作为参数,调用拷贝构造函数,在main函数的栈帧里初始化
itr变量,这时候会触发你写的拷贝构造打印逻辑
但在默认编译配置下,编译器会开启返回值优化,直接跳过中间临时对象的创建步骤:
- 编译器提前识别到
begin()的返回值会直接用来初始化同类型的itr变量,不会单独为begin()内的返回值分配临时栈内存 - 直接在main函数栈帧中
itr所在的内存位置,传入参数this->head调用myIterator(Node* p)普通构造函数,直接完成itr的成员初始化(给np赋值为链表头节点指针) - 全程没有生成中间临时对象,自然不会触发拷贝构造函数,所以你只会看到一次普通构造的打印输出。
验证方法
如果你想观察到拷贝构造的调用,可以在GCC/Clang编译时添加-fno-elide-constructors编译选项关闭拷贝省略优化,重新运行代码就会依次看到普通构造、拷贝构造的打印信息。
内容的提问来源于stack exchange,提问作者Daniel Zaken
相关产品推荐
相关产品推荐

