C++和Swift : How are structs handled in C++ stack frames? struct继承的复杂性为什么Swift不支持struct继承?

标签 c++ swift memory-model stack-frame

在最近的一次开发者聚会上,简要讨论了 Swift 中的 struct 继承(或者更准确地说,Swift 中缺少 struct 继承)的主题。我假设 Swift 不支持 struct 继承的原因是因为:

  • struct是值类型
  • 值类型在堆栈帧之间复制
  • 继承意味着 struct 的大小可以变化(例如,如果 Lorry 继承自 VehicleLorry 添加 .weightCapacity 然后 Lorry 将比 Vehicle 需要更多的空间)
  • 具有在编译时未知大小的值类型参数会使调用者的栈帧构造和被调用者访问数据变得复杂

我假设正是由于这些复杂性,这可能会为涉及 struct 的每个函数调用添加额外的操作,从而降低性能,Swift 不允许 struct继承。这个推理正确吗?

但后来我想到了 C++。 C++ 确实允许 struct 继承,并且 C++ 非常注重性能。这让我觉得我对 Swift 不允许 struct 继承的推理是错误的。 C++ 如何在不对性能产生负面影响的情况下实现 struct 继承?

最佳答案

How does C++ achieved struct inheritance without negatively impacting performance?

在 C++ 中,编译器总是 知道struct 的大小。但是当按值复制基类时,对象会被“切片”:只复制基类的成员,新对象与原始对象的派生类没有任何关系。

因此,如果函数想要对 Vehicle 执行某些操作而不切断其额外标识,则它必须使用指向 Vehicle 的指针或引用作为函数参数类型,或者返回类型。但那时您不再有“在堆栈帧之间复制的值类型”。

关于C++和Swift : How are structs handled in C++ stack frames? struct继承的复杂性为什么Swift不支持struct继承?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25647401/

相关文章:

ios - 无论分辨率如何,获取点的坐标

c++ - 创建/加入线程时的隐式同步

c++ - 成员指针指向的函数类型

python - 有没有办法从 C++ 调用 `async` python 方法?

c++ - C++内存管理相关查询

swift - UICollectionViewCell 中 UILabel 的 UIAppearance - 选定/未选定

c++ - sqlite 更新查询在 C++ 中不起作用

ios - 带有请求完成处理程序的数据并不总是被调用

c++ - 内存模型,负载获取语义实际上是如何工作的?

C++11:memory_order_relaxed 和 memory_order_consume 的区别