当然,在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.但几乎所有东西都可以"模仿".它只需要明确/手动完成更多工作.
我不相信 C 缺少移动语义。这是导致移动语义在 C 中“缺失”的所有 C++ 功能。由于您无法执行调用函数来分配内存的自动结构复制,因此您没有自动复制复杂且昂贵的数据结构的系统。
当然,这是本意。C 是一种比 C++ 更轻量级的语言,因此创建自定义复制和赋值构造函数的复杂性并不意味着成为语言的一部分 - 您只需编写代码来完成需要作为函数完成的工作。如果你想要“深拷贝”,那么你会写一些东西来遍历你的数据结构并分配内存等。如果你想要浅拷贝,你会写一些东西来将数据结构中的指针复制到另一个(并且可能设置源到NULL) - 就像移动语义构造函数一样。
当然,您只需要 C 中的 L 和 R 值(它在 = 符号的左侧或右侧),没有引用,并且显然没有 R 值引用。这是在 C 中通过使用(将事物转换为指针)的地址来实现的。
因此,C 缺少的并不是真正的移动语义,而是 C++ 语言设计附带的复杂构造函数和赋值运算符(等)使移动语义在该语言中成为有用的东西。像往常一样,语言会根据它们的特性发展。如果您没有特征 A,而特征 B 依赖于特征 A 的存在,那么您就不需要“需要”特征 B。
当然,除了异常处理和常量引用[以及 C++11 中的 R 值引用,本质上是一个允许修改的常量引用],我认为 C++ 中没有任何主要特性可以不是通过 C 实现的。它有时会有点笨拙和混乱(并且在语法上不会那么漂亮,并且当您以错误的方式覆盖函数时,编译器不会给您整洁的错误消息,您需要手动强制转换指针等)。[在陈述这样的事情之后,有人会指出“你显然没有想到X”,但总体来说仍然是正确的——C可以做你想用C做的99.9%]
| 归档时间: |
|
| 查看次数: |
718 次 |
| 最近记录: |