什么是复制省略?什么是(命名的)返回值优化?它们意味着什么? 在什么情况下可能会发生?有哪些限制? 如果您被引用到这个问题,可能正在寻找 简介。 有关技术概述,请参见标准参考。 在这里查看常见情况。
我不明白什么时候应该使用std::move,什么时候应该让编译器进行优化... 例如: using SerialBuffer = vector< unsigned char >; // let compiler optimize it SerialBuffer read( si...
简短版:在许多编程语言中,返回大对象(例如向量/数组)是很常见的。如果一个类具有移动构造函数,那么在C++0x中是否可以接受这种风格,或者C++程序员认为它很奇怪/丑陋/可恶? 详细版:在C++0x中,这仍然被认为是不好的形式吗?std::vector<std::string> ...
有些人可能不知道在C语言中可以通过值传递结构体并返回结构体。我的问题是当在C语言中返回结构体时,编译器是否会进行不必要的复制。C语言编译器(例如GCC)是否使用返回值优化(RVO)优化?还是这只是C++中的概念?我所读到的关于RVO和拷贝省略的所有内容都是关于C++的。 让我们考虑一个例子。...
在很多情况下,当从函数中返回一个本地对象时,会触发RVO(返回值优化)。然而,我认为明确使用std::move至少可以强制执行移动语义,即使RVO没有发生,但是只要可能,RVO仍然会被应用。然而,事实似乎并非如此。#include "iostream" class Hea...
我需要在命令行上添加哪些标志来禁用g++编译器自动启用的返回值优化?
假设我们有以下代码:std::vector<int> f() { std::vector<int> y; ... return y; } std::vector<int> x = ... x = f(); 编译器似乎有两种方法: (a) N...
想象一下: S f(S a) { return a; } 为什么不允许给a和返回值赋别名? S s = f(t); S s = t; // can't generally transform it to this :( 规范不允许这种转换,如果 S 的复制构造函数具有副作用。相...
请考虑以下简单示例,其中函数bar返回一个具有私有析构函数的类A的对象,并且必须进行强制返回值优化(RVO): class A { ~A() = default; }; A bar() { return {}; } 这段代码被Clang编译器接受,但被GCC编译器以以下错误拒绝:error: ...
看下面的示例,返回一个可选的UserName - 一个可移动/可复制的类。 std::optional<UserName> CreateUser() { UserName u; return {u}; // this one will cause a copy of ...