return-value-optimization相关内容
在许多情况下,从函数返回LOCAL时,会使用RVO(返回值优化)。然而,我认为显式使用std::move至少会在RVO没有发生时强制移动,但在可能的情况下仍会应用RVO。然而,情况似乎并非如此。 #include "iostream" class HeavyWeight { public: HeavyWeight() { std::cout
..
假设我在C/C++中有一个具有固定大小的数组成员的struct,例如: #define SIZE 10000 struct foo{ int vector_i[SIZE]; float vector_f[SIZE]; }; 我想创建一个函数,该函数将返回foo的实例,如下所示: foo func(int value_i, float value_f){ int i;
..
..
请考虑这三个功能. std::string get_a_string(){返回“你好";}std::string get_a_string1(){返回 std::string("hello");}std::string get_a_string2(){std::string str("你好");返回字符串;} RVO 是否适用于所有三种情况? 可以像上面的代码那样返回一个临时的吗?我相信这没
..
我想填充 std::vector(或其他一些 STL 容器): class Foo {上市:Foo(int _n, const Bar &_m);私人的:std::vectorfooes_;} 1.好看的演员,昂贵的性能 std::vectorget_vector(int _n,const Bar &_m){std::vector退;...//根据参数填充 ret返回 ret;}Foo::F
..
C++ 中的引用让我感到困惑.:) 基本思想是我试图从函数返回一个对象.如果可能的话,我想不返回指针(因为那样我必须手动delete它)并且不调用复制构造函数(为了效率,自然添加: 也是因为我想知道我是否无法避免编写复制构造函数). 总而言之,以下是我发现的执行此操作的选项: 函数返回类型可以是类本身 (MyClass fun() { ... }) 或对类的引用 (MyClass
..
有些人不知道可以传递和返回结构体按 C 中的值.我的问题是关于编译器在 C 中返回结构时制作不必要的副本. GCC 等 C 编译器是否使用 返回值优化(RVO) 优化还是仅 C++ 的概念?我所读到的关于 RVO 和复制省略的所有内容都与 C++ 有关. 让我们考虑一个例子.我目前正在 C 中实现 双双数据类型(或者更确切地说是 float-float 开始,因为我发现单元测试很容易).考虑
..
考虑以下事项: struct A {/* ... */};一个 foo() {自动 p = std::make_pair(A{}, 2);//... 做一点事返回 p.first;}汽车 a = foo(); p.first 会被复制、移动或 RVO 编辑吗? 解决方案 我发现在 Visual Studio 2010 和 gcc-5.1 RVO 中未应用(参见例如 http://col
..
我需要在命令行上使用什么标志来禁用由 g++ 编译器自动启用的返回值优化? 解决方案 -fno-elide-constructors C++ 标准允许实现省略创建临时对象,该临时对象仅用于初始化另一个相同类型的对象.指定此选项会禁用该优化,并强制 G++ 在所有情况下调用复制构造函数.[来源:man gcc]
..
我想用一个函数初始化一个大对象.目前我有: fn initialize(mydata: &mut Vec>) {/* ... */} 我更喜欢: fn initialize() ->Vec>{/* ... */} 我听说 C++ 经常实现返回值优化 (RVO),如果你很幸运并且有一个好的编译器.我们可以在这里禁用复制并让它由传递给函数的隐藏指针返回吗?RVO 是语言的一部分还是可选的优化?
..
假设我们有以下代码: std::vectorF(){std::vectory;...返回 y;}std::vectorx = ...x = f(); 这里的编译器似乎有两种方法: (a) NRVO:破坏 x,然后构造 f() 代替 x. (b) 移动:在临时空间构造 f(),将 f() 移动到 x,析构 f(). 根据标准,编译器是否可以自由使用任一方法? 解决方案 编译
..
我不明白什么时候应该使用 std::move 以及什么时候应该让编译器优化...例如: 使用 SerialBuffer = vector;//让编译器优化它SerialBuffer 读取( size_t size )const{SerialBuffer 缓冲区(大小);读取(开始(缓冲区),结束(缓冲区));//返回值优化返回缓冲区;}//显式移动SerialBuffer 读取( size_t
..
什么是复制省略?什么是(命名的)返回值优化?它们意味着什么? 它们会在什么情况下发生?什么是限制? 如果有人提到过这个问题,您可能正在寻找简介. 有关技术概述,请参阅标准参考. 请参阅常见案例此处. 解决方案 简介 有关技术概述 - 跳至此答案. 对于发生复制省略的常见情况 - 跳至此答案. 复制省略是大多数编译器实现的优化,用于在某些情况下防止额外的(可
..
我问了一个非常简单的问题,但不幸的是我自己想不出答案. 假设我有一些数据结构来保存设置并充当设置映射.我有一个 GetValue(const std::string& name) 方法,它返回相应的值. 现在我想弄清楚 - 什么样的返回值方法会更好.显而易见的方法是让我的方法像 std::string GetValue(const std::string& name) const
..
下面的代码可以很好地工作(显示RVO): 结构A { A(int){cout
..
假设我具有该功能 #include std :: string const foo() { std :: string s =“ bar”; return s; } int main() { std :: string t = foo(); } 编译器是否可以为 t ,即使 s 和 t 的类型都与由于 const -ne
..
C ++中的参考文献使我感到困惑. :) 基本思想是我试图从函数中返回一个对象.我想这样做而不返回指针(因为那我必须手动delete),并且如果可能的话也不必调用复制构造函数(出于效率考虑,自然会添加:也是因为我想知道是否不能避免编写副本构造函数. 总而言之,这是我发现的执行此操作的选项: 函数返回类型可以是类本身(MyClass fun() { ... })或对该类的引用(My
..
我想用一个函数初始化一个大对象.目前,我有: fn initialize(mydata: &mut Vec>) { /* ... */ } 我希望拥有: fn initialize() -> Vec> { /* ... */ } 我听说C ++通常会实现返回值优化(RVO),如果您幸运的话,并且具有良好的编译器.我们可以在
..
我们有很多返回值的函数: Foo function_1(){ Foo f; // ... return f; } Bar function_2(){ Bar b; // ... return b; } Baz function_3(){ Baz b; // ... return b; } 我正在使用它们来创建局部
..
请考虑这三个函数。 std :: string get_a_string() { return “你好”; } std :: string get_a_string1() { return std :: string(“hello”); } std :: string get_a_string2() { std :: string str(“hello”);
..