当前位置:  开发笔记 > 编程语言 > 正文

在C++中移动语义是否缺少C?

如何解决《在C++中移动语义是否缺少C?》经验,为你挑选了1个好方法。

我一直在SO和其他来源上搜索此事,但我无法解决这个问题.使用rvalues和xvalues的资源对C++来说有点新(使用C++ 11).

现在,我们 - C程序员 - 错过了什么吗?或者C中有相应的技术可以从这些资源效率中受益?

编辑:这个问题不是基于意见.我无法描述我的问题.我要问的是c中是否有相应的技术.



1> AnT..:

当然,在C中也有类似的技术.我们已经在C中做了"移动语义"多年.

首先,C++中的"移动语义"基于一系列重载决策规则,这些规则描述了在重载决策期间rvalue引用参数的函数如何表现.由于C不支持函数重载,因此这个特定问题不适用于C.您仍然可以通过使用专用名称编写专用数据移动函数并在要移动数据时显式调用它们来手动实现C语言中的移动语义.复制它.例如,对于您自己的数据类型,struct HeavyStruct您可以使用适当的实现编写a copy_heavy_struct(dst, src)move_heavy_struct(dst, src)函数.在每种情况下,您只需手动选择最合适/最有效的呼叫.

其次,C++中隐式移动语义的主要目的是在深度复制不必要地低效的上下文中作为隐式深层复制语义的替代.由于C没有隐式深拷贝语义,因此在C中甚至不会出现问题.C总是执行浅复制,这已经非常类似于移动语义.基本上,您可以将C视为一种始终移动的语言.它只需要一些手动调整就可以使其移动语义达到完美.

当然,从字面上重现C++移动语义的所有特征可能是不可能的,因为,例如,不可能将C指针绑定到rvalue.但几乎所有东西都可以"模仿".它只需要明确/手动完成更多工作.


@ sp2danny:嗯......这是浅层和深层复制的非正统定义.在我的书中*浅拷贝*是复制,只复制对象的直接成员,对象的顶级内存(正是原始`memcpy`所做的那样),但间接忽略对象拥有的任何内存(通过指针或引用) .*深度复制*是复制,它复制对象的每个部分,而不管为了到达该部分,必须通过多少级别的间接.如果一个对象可以被一个`memcpy`正确复制,那么该对象是平的,不需要深度复制.
推荐阅读
mobiledu2402851373
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有