首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

关于C++函数返回值的拷贝优化问题

在传统C++程序中,如果函数的返回值是一个对象的话,可能需要对函数中的局部对象进行拷贝。如果该对象很大的话,则程序的效率会降低。...在C++ 11以后,出现的移动语义(Move Semantic)及拷贝优化(Copy Elision)都是解决这个问题的方法。本文试图以一个最简单的例子来说明这个问题。...假设这个对象是一个大对象,则拷贝过程会花费一些时间,降低了程序的执行效率。而使用移动语义的话,直接转义对象的所有权,效率会高一些。...结论对于C++函数返回一个大对象的时候,在编译器能进行拷贝优化的时候,会优先进行返回值的拷贝优化。...有了上述结论,我们在写程序的时候最佳实践是函数返回值可以直接返回函数体内定义的零时对象,但是我们需要在定义该对象的时候实现移动构造函数。

53940
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    关于C++函数返回值的拷贝优化问题

    在传统C++程序中,如果函数的返回值是一个对象的话,可能需要对函数中的局部对象进行拷贝。如果该对象很大的话,则程序的效率会降低。...在C++ 11以后,出现的移动语义(Move Semantic)及拷贝优化(Copy Elision)都是解决这个问题的方法。 本文试图以一个最简单的例子来说明这个问题。...假设这个对象是一个大对象,则拷贝过程会花费一些时间,降低了程序的执行效率。而使用移动语义的话,直接转义对象的所有权,效率会高一些。...结论 对于C++函数返回一个大对象的时候,在编译器能进行拷贝优化的时候,会优先进行返回值的拷贝优化。...有了上述结论,我们在写程序的时候最佳实践是函数返回值可以直接返回函数体内定义的零时对象,但是我们需要在定义该对象的时候实现移动构造函数。

    18310

    返回类型引用(ref-qualified)的C++成员函数暗示了什么?

    一、引子:返回引用类型的成员函数是 暗示了使用它的this指针是左值还是右值。反过来说,如果一个成员函数不返回引用类型,那么对this指针是左值还是右值都是调用同一个函数。...比如说:这段代码Obj o{2}; o.getVal();跟这段代码Obj{2}.getVal()使用了同一个getVal()函数。那理解到这里是对的吗?...----二、解释:先说结论,来说一个c++的一个理解。如果成员函数是有一致性(consistency)的,那么non-const, non-static的函数 总是要被&( &-qualified)。...而另一种写法A{}.inc()是被允许的。这是consistency的做法。...----三、扩展当然书写设计自己的成员函数,不一定都有必要去做ref-qualified,但是这里我带你看一些使用ref-qualified的真实例子。

    21220

    C++ 新特性学习(五) — 引用包装、元编程的类型属性和计算函数对象返回类型

    ()操作符, 用于执行引用的函数 同时与其配对的函数有 std::ref 返回std::reference_wrapper,可以视为转换对象为引用 std::cref 返回常量引用对象std::reference_wrapper...元编程的类型属性 元编程的定义是可以修改自身或其他代码的代码,当然,C++不是动态语言,这个修改可以在编译或执行的时期。...= %d\n", factorial::value); return 0; } 比较有意思吧,这个不是新标准,新C++标准增加了类型属性,什么叫类型属性呢?...:result_of::type 即是返回类型,比如: struct foo { double operator()(char, int); }; // 这两个是一样的 std::result_of...也许是我还没能把C++用的非常灵活吧,感觉后面的部分不太实用的样子。 还需要继续努力啊

    1.3K30

    C++ 新特性学习(五) — 引用包装、元编程的类型属性和计算函数对象返回类型

    ()操作符, 用于执行引用的函数 同时与其配对的函数有 std::ref 返回std::reference_wrapper,可以视为转换对象为引用 std::cref 返回常量引用对象std::...然后是 元编程的类型属性 元编程的定义是可以修改自身或其他代码的代码,当然,C++不是动态语言,这个修改可以在编译或执行的时期。...= %d\n", factorial::value); return 0; } 比较有意思吧,这个不是新标准,新C++标准增加了类型属性,什么叫类型属性呢?...::result_of::type 即是返回类型,比如: struct foo { double operator()(char, int); }; // 这两个是一样的 std::result_of...也许是我还没能把C++用的非常灵活吧,感觉后面的部分不太实用的样子。 还需要继续努力啊

    1.8K30

    C++编程经验(6):使用C++风格的类型转换

    为什么推荐使用C++风格类型转换? 不是说别的风格的类型转换机制不好,但是写C++代码的话,既然人家有,那就慢慢的适应嘛,入乡随俗。...我们以前写类型转换一般是这样的:(type) expression,而C++引进了四个类型转换的操作符: static_cast const_cast dynamic_cast reinterpret_cast...失败的转换将返回空指针(当对指针进行类型转换时)或者抛出异常(当对引用进行类型转换时): father* pw; ......使用这个操作符的类型转换,其的转换结果几乎都是执行期定义。 因此,使用reinterpret_casts 的代码很难移植。...转换函数指针的代码是不可移植的(C++不保证所有的函数指针都被用一样的方法表示),在一些情况下这样的转换会产生不正确的结果,所以你应该避免转换函数指针类型,除非万不得已。

    59120

    C++使用mysql判断select查询结果是否为空mysql_query返回值问题

    C++使用mysql判断select查询结果是否为空/mysql_query返回值问题 MYSQL sqlcon; string str = "SELECT * FROM dt_user where user...mysql_query(&(this->sqlcon), str) { return true; } mysql_query的返回值,无效sql语句的时候会返回false,但如果输入sql语句时有效的...,仍然会返回有效的id,换句话说mysql_query无论是否查询值,,只要语法不出问题,都会返回真。...NULL时,row = NULL 这个表达式的bool为假 { return true; } mysql_store_result():将mysql_query()查询到的结果集,赋给MYSQL_RES...变量 mysql_fetch_row():将MYSQL_RES变量中的一行赋给MYSQL_ROW变量,当重复调用mysql_fetch_row()时,将逐个获取结果集的行,到最后一行后返回NULL。

    11.3K41

    【C++】函数 指针类型参数 与 引用类型参数 对比 ( 修改外部变量需要传入的参数要求 | 参数作返回值 )

    指针与引用类型参数 II . 指针作为参数和返回值 III . 引用参数简介 IV . 引用作为参数和返回值 I . 博客总结 . 指针与引用类型参数 ---- 1 ....讨论问题 : 本章只针对一点进行讨论 , 那就是对两种类型的参数修改 , 是否影响到外部的变量 ; 传入什么样的参数才能修改外部变量 , 即 参数当返回值使用 ; 2 ....参数使用语言环境 : 引用类型参数只能在 C++ 环境中使用 , 指针类型参数可以用于 C / C++ 两种语言环境中 , 因此很多基础库 如 FFMPEG , OpenSL ES 等使用的都是指针类型参数...C++ 中的引用参数 : C++ 在 C 语言基础上扩展了 引用 数据类型 , 使用引用可以替代上面的指针作为参数的情况 , 使参数具有返回结果的能力 ; 3 ....作用及意义 : ① 具有返回值能力 : 使用引用作参数 , 可以将参数当做返回值使用 ; ② 提高参数传递效率 : 大型对象作参数时 , 使用引用类型 , 可以提高参数传递效率 ; 更多关于引用的内容参考

    2.2K20

    MySQL存储过程、函数、视图、触发器、索引和锁的基本知识

    知识点-视图的CRUD 1.高山 掌握视图的CRUD操作 2.演绎 创建视图 修改视图 查看视图 对视图数据进行操作 解决视图数据操作影响基表的问题 删除视图 3.攀登 3.1 创建视图 视图可以从各式各样的查询语句中创建...函数需要 RETURNS 指定返回的类型。 routine_body 包含合法的SQL过程语句体。...(FUNCTION参数总是被认为是IN参数) RETURNS字句只能对FUNCTION做指定,对函数而言这是强制的。它用来指定函数的返回类型,而且函数体必须包含一个RETURN value语句。...对于EXIT处理程序,当前BEGIN…END复合语句的执行被终止。UNDO 处理程序类型语句还不被支持。 SQLWARNING是对所有以01开头的SQLSTATE代码的速记。...MVCC 多版本并发控制,采用了一个快照版本的数据来供当前事务使用,也是可重复读隔离级别用来解决不可重复读问题的底层方案。

    1.1K10

    C++中使用switch..case语句的易出错陷阱和规避方法

    参考链接: C++ switch..case语句 C++作为C语言的升级版,支持很多C语言不支持的语法。...fun() {   int n = 6;   int i = 0;   for (i = 0; i < 3; i++)   {     n += i;   }   return n; }   不过,如果使用...回到主题,这里要说一个C++在语法方便的同时带来的隐患。...问题出现在当我们尝试初始化整形变量n的时候。定义变量的同时初始化,是一个好习惯,然而,此时对n的初始化却会引发错误导致无法编译。...在那种情况下,编译器的提示信息可能不会像本文示例这样给出明确的错误描述,而是可能会因为上下文环境的原因而给出晦涩不清的错误描述,让人一下看不出问题到底出在了哪里。

    2.2K30

    MySQL中无GROUP BY情况下直接使用HAVING语句的问题探究

    这篇文章主要介绍了MySQL中无GROUP BY情况下直接使用HAVING语句的问题探究,同时探究了该情况下MAX与MIN功能的使用情况,需要的朋友可以参考下: 今天有同学给我反应,有一张表,id是主键...旁白 一般来说,HAVING子句是配合GROUP BY使用的,单独使用HAVING本身是不符合规范的, 但是MySQL会做一个重写,加上一个GROUP BY NULL,”SELECT * FROM...是不是发现问题了? MAX/MIN函数取值是全局的,而不是LIMIT 1这个分组内的。 因此,当GROUP BY NULL的时候,MAX/MIN函数是取所有数据里的最大和最小值!...HAVING id=MAX(id)”本质上是”SELECT * FROM t HAVING id=3″,当然没有返回记录,这就是问题的根源。...GROUP BY NULL时MAX/MIN的行为,是这个问题的本质,所以啊,尽量使用标准语法,玩花样SQL之前,一定要搞清楚它的行为是否与理解的一致。

    4.1K41
    领券