527得票5回答
复制省略和返回值优化是什么?

什么是复制省略?什么是(命名的)返回值优化?它们意味着什么? 在什么情况下可能会发生?有哪些限制? 如果您被引用到这个问题,可能正在寻找 简介。 有关技术概述,请参见标准参考。 在这里查看常见情况。

222得票4回答
C++11 返回值优化还是移动?

我不明白什么时候应该使用std::move,什么时候应该让编译器进行优化... 例如: using SerialBuffer = vector< unsigned char >; // let compiler optimize it SerialBuffer read( si...

111得票7回答
在C++中,从函数返回一个vector仍然是不好的实践吗?

简短版:在许多编程语言中,返回大对象(例如向量/数组)是很常见的。如果一个类具有移动构造函数,那么在C++0x中是否可以接受这种风格,或者C++程序员认为它很奇怪/丑陋/可恶? 详细版:在C++0x中,这仍然被认为是不好的形式吗?std::vector<std::string> ...

75得票2回答
C中的返回值优化和复制省略

有些人可能不知道在C语言中可以通过值传递结构体并返回结构体。我的问题是当在C语言中返回结构体时,编译器是否会进行不必要的复制。C语言编译器(例如GCC)是否使用返回值优化(RVO)优化?还是这只是C++中的概念?我所读到的关于RVO和拷贝省略的所有内容都是关于C++的。 让我们考虑一个例子。...

68得票2回答
为什么使用std::move会阻止返回值优化(RVO)?

在很多情况下,当从函数中返回一个本地对象时,会触发RVO(返回值优化)。然而,我认为明确使用std::move至少可以强制执行移动语义,即使RVO没有发生,但是只要可能,RVO仍然会被应用。然而,事实似乎并非如此。#include "iostream" class Hea...

63得票1回答
禁用g++的返回值优化

我需要在命令行上添加哪些标志来禁用g++编译器自动启用的返回值优化?

58得票1回答
搬移还是命名返回值优化(NRVO)?

假设我们有以下代码:std::vector<int> f() { std::vector<int> y; ... return y; } std::vector<int> x = ... x = f(); 编译器似乎有两种方法: (a) N...

42得票6回答
为什么按值传递的参数被排除在NRVO之外?

想象一下: S f(S a) { return a; } 为什么不允许给a和返回值赋别名? S s = f(t); S s = t; // can't generally transform it to this :( 规范不允许这种转换,如果 S 的复制构造函数具有副作用。相...

38得票2回答
为什么在 C++ 中强制使用返回值优化时需要公共析构函数?

请考虑以下简单示例,其中函数bar返回一个具有私有析构函数的类A的对象,并且必须进行强制返回值优化(RVO): class A { ~A() = default; }; A bar() { return {}; } 这段代码被Clang编译器接受,但被GCC编译器以以下错误拒绝:error: ...

34得票3回答
为什么返回std::optional有时会移动,有时会复制?

看下面的示例,返回一个可选的UserName - 一个可移动/可复制的类。 std::optional<UserName> CreateUser() { UserName u; return {u}; // this one will cause a copy of ...