2014-09-03 73 views
3

在最近的一位开发者遇到了Swift中继承的struct这个话题(或者更确切地说,Swift中缺少继承的struct)。我认为为什么斯威夫特不支持struct继承的原因是因为:C++和Swift:如何在C++堆栈框架中处理结构?结构继承的复杂性是为什么Swift不支持结构继承?

  • struct s为值类型
  • 值类型是堆栈帧之间复制
  • 继承将意味着一个struct的大小可以变化(例如,如果从VehicleLorry继承和Lorry添加然后Lorry需要比Vehicle更多空间)
  • 具有值类型参数s的未在编译时已知会呼叫者和复杂堆栈帧结构大小访问数据为被叫

我认为,这是因为这些并发症,这大概会增加额外的操作,每一个的函数调用涉及struct并因此降低性能,Swift不允许struct继承。这个推理是否正确?

但是,然后我尽管关于C++。 C++确实允许struct继承,并且C++非常注重性能。这让我觉得我的推理不允许struct继承是错误的。 C++如何实现struct继承而不会对性能产生负面影响?

回答

4

C++如何在不影响性能的情况下实现结构体继承?

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

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

0

由于结构是值类型,所以应该将它们复制到函数中并返回。所以,你可以调用与派生结构为非不同诱变的方法,但将无法返回从中派生值,所以

struct Vehicle { 
    var color: Color 

    mutating func paintWhite() { 
     self.color = .White 
    } 
} 


struct Lorry: Vehicle ... 

var lorry = Lorry(color:.Blue) 
lorry.paintWhite() // <- wouldn't work, as paintWhite takes inout Vehicle 

不叫突变方法结构的能力将是有益的少得多,并更令人困惑。