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

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

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

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

    最佳答案



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

    因此,如果一个函数想用 Vehicle 做一些事情而不切掉它的额外标识,它必须使用一个指向 Vehicle 的指针或引用作为函数参数类型或返回类型。但那时你不再有“在堆栈帧之间复制的值类型”。

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

    10-11 22:36
    查看更多