在最近的一次开发者聚会上,简要讨论了 Swift 中的 struct
继承(或者更准确地说,Swift 中缺少 struct
继承)的主题。我假设 Swift 不支持 struct
继承的原因是因为:
struct
是值类型- 值类型在堆栈帧之间复制
- 继承意味着
struct
的大小可以变化(例如,如果Lorry
继承自Vehicle
和Lorry
添加.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/