3

最近の開発者ミーティングで、Swift のstruct継承 (より正確にはstructSwift の継承の欠如) のトピックが簡単に議論されました。structSwift が継承をサポートしていない理由は次のとおりだと思います。

  • structs は値型です
  • 値の型はスタック フレーム間でコピーされます
  • 継承は、 a のサイズstructが異なる可能性があることを意味します (たとえば、Lorry継承元VehicleLorry追加の.weightCapacity場合Lorry、 よりも多くのスペースが必要になりますVehicle)
  • コンパイル時に不明なサイズの値型パラメーターを持つと、呼び出し元のスタック フレームの構築と呼び出し先のデータへのアクセスが複雑になります。

Swift が継承structを許可しないのは、これらの複雑さが原因であり、おそらく a を含むすべての関数呼び出しに余分な操作が追加され、パフォーマンスが低下するためだと思います。structこの推論は正しいですか?

しかし、私はC++について考えました。C++ は継承を許可structしており、C++ は非常にパフォーマンス重視です。structこれは、Swift が継承を許可しないという私の推論が間違っていると思わせます。C++ はどのようにしてstructパフォーマンスに悪影響を与えずに継承を達成しましたか?

4

2 に答える 2

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

変化するメソッドを呼び出す機能がなければ、構造体はあまり役に立たず、混乱を招きます。

于 2014-09-04T19:14:10.863 に答える