c++ - C++ 中的 move 语义是否缺少 C 所缺少的东西?

标签 c++ c c++11 move

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

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

编辑: 这个问题不是基于任何意见。我只是无法描述我的问题。我想问的是c中有没有相应的技巧。

最佳答案

当然,C 中也有类似的技术。我们在 C 中进行“move 语义”已有很长时间了。

首先,C++ 中的“move 语义”基于一系列重载决议规则,这些规则描述了具有右值引用参数的函数在重载决议期间的行为方式。由于 C 不支持函数重载,因此这个具体问题不适用于 C。您仍然可以在 C 中手动实现 move 语义,方法是编写具有专用名称的专用数据 move 函数,并在您想要 move 数据时显式调用它们,而不是复制它。例如,对于您自己的数据类型 struct HeavyStruct,您可以编写 copy_heavy_struct(dst, src)move_heavy_struct(dst, src) 函数适当的实现。在每种情况下,您只需手动选择最合适/最有效的调用。

其次,C++ 中隐式 move 语义的主要目的是在深度复制不必要地低效的情况下作为隐式深度复制语义的替代方案。由于 C 没有隐式的深拷贝语义,所以在 C 中甚至不会出现这个问题。C 总是执行浅拷贝,这已经非常类似于 move 语义。基本上,您可以将 C 视为一种永远在变化的语言。它只需要一些手动调整就可以使其 move 语义达到完美。

当然,要从字面上重现 C++ move 语义的所有特性可能是不可能的,因为,例如,不可能将 C 指针绑定(bind)到右值。但实际上一切都可以“模拟”。它只需要明确/手动完成更多工作。

关于c++ - C++ 中的 move 语义是否缺少 C 所缺少的东西?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43270305/

相关文章:

c++ - 完美转发构造函数和删除构造函数

c++ - 对于用 C 编写的 AVR micro,Const Char 数组被修改为全 0

c - 是否可以在每条指令后转储内存?

c++ - pthread 之间共享和不共享的属性是什么

c - C 中的回溯练习图形颜色

python - 如何使用 pyparsing 构建完整的 C 解析器?

c++11 - 无法使用 autoconf 启用 C++11

c++ - 另一个别名的模板别名

c++ - odbc 客户端无法从 MySQL DB 读取 utf8 字符串

c++ - 为什么将 "&& true"添加到约束会使函数模板成为更好的重载?