2014-09-03 7 views
3

최근 개발자가 Swift에서 struct 상속을 주제로 (또는 더 정확하게는 Swift에서 struct 상속 부족) 간략하게 논의했습니다.C++ 및 Swift : C++ 스택 프레임에서 구조체가 어떻게 처리됩니까? Swift가 struct 상속을 지원하지 않는 이유는 struct 상속의 복잡성입니까?

  • struct
  • 상속이 struct의 크기가 달라질 수 있다는 것을 의미
  • 값 형식은 스택 프레임 사이에 복사되는 값 유형은 다음과 같습니다 나는 때문에 스위프트가 struct 상속을 지원하지 않는 이유가 있다고 가정 값 유형 파라미터를 갖는
  • (예 LorryVehicle로부터 상속 Lorry는 다음 LorryVehicle가보다 더 많은 공간을 필요로 할 경우, 추가) 컴파일 시간에 알려지지 않은 크기의 호출자는 호출자의 스택 프레임 구성을 복잡하게 만들며 호출 수신자의 데이터에 액세스 할 수 있습니다.

나는 이러한 복잡성으로 인해 모든 struct을 포함하여 성능을 저하시키는 함수 호출은 Swift가 struct 상속을 허용하지 않습니다. 이 논리가 맞습니까?

그러나 그때 나는 C++에 대해 생각합니다. C++은 struct 상속을 허용하고 C++는 매우 성능 중심입니다. 이것은 내가 스위프트에 대한 나의 논리가 struct 상속을 허락하지 않는다고 생각하게 만든다. 어떻게 C++이 성능에 부정적인 영향을 미치지 않고 struct 상속을 얻었습니까?

답변

4

C++은 성능에 부정적인 영향을 미치지 않으면 서 어떻게 구조 상속을 얻었습니까? C++에서

, 컴파일러 항상struct의 크기를 알고있다. 그러나 기본 클래스를 값으로 복사하면 객체는 "슬라이스"됩니다. 기본 클래스의 멤버 만 복사되고 새 객체는 원래 객체의 파생 클래스와 관련이 없습니다.

따라서 함수가 여분의 ID를 분리하지 않고 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 

, 파생 구조체와 비 돌연변이 메소드를 호출 할 수 있지만, 그것에서 파생 된 값을 반환 할 수 없을 것이며, 훨씬 더 혼란 스럽네.