首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++和Swift:如何在C++堆栈帧中处理结构?结构继承的复杂性为什么Swift不支持结构继承?

C++和Swift:如何在C++堆栈帧中处理结构?结构继承的复杂性为什么Swift不支持结构继承?
EN

Stack Overflow用户
提问于 2014-09-03 14:48:41
回答 2查看 370关注 0票数 3

在最近的一次开发人员会议上,简要讨论了Swift中的struct继承(或者更确切地说,Swift中缺乏struct继承的问题)。我认为Swift不支持struct继承的原因是:

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

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

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

EN

回答 2

Stack Overflow用户

发布于 2014-09-03 15:13:06

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

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

因此,如果一个函数想要在不分割其额外标识的情况下对Vehicle做一些事情,它必须使用一个指针或对Vehicle的引用作为函数参数类型或返回类型。但此时,您不再有“在堆栈帧之间复制值类型”。

票数 4
EN

Stack Overflow用户

发布于 2014-09-04 19:14:10

因为结构是值类型,所以应该将它们复制到函数和back中。因此,您可以使用派生的结构调用非变异方法,但是无法从它返回派生值,因此

代码语言:javascript
复制
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

如果没有调用变异方法的能力,那么结构就不会那么有用,也会更加混乱。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25647401

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档