6월 25, 2017

[EC++ 20] Prefer pass-by-reference-to-const to pass-by-value.


Pass-by-reference-to-  const  

의 좋은 점
  • pass-by-value 로 인한 불필요한 ctor와 dtor의 호출을 막을 수 있다.
  • Slicing problem을 막을 수 있다.
  • param.로 어떤 객체를 받을 때, param.의 타입이 받으려는 객체의 base 클래스인 경우, param.로 그 객체를 받아 복사생성하는 과정에서 객체에서 derived 된 특성(data, function)이 잘려나가게 되는데, 이를 Slicing problem이라 한다.
  • 단, built-in type의 경우 pass-by value가 더 효율적이다. 이는 iterator나 function object in STL에도 해당되는데, 이런 기능들이 pass by value로 건네주도록 설계되었기 때문이다.
  • 작은 크기의 객체라고 해서 반드시 pass-by-value가 효과적인 것은 아니다.
  • 몇몇 컴파일러의 경우 built in type과 User defined type를 다르게 취급하는 경우가 있다. 또한 나중에 type의 설계가 변경됨에 따라 user defined type의 크기가 더 커지는 등의 변화가 있을 수도 있다.

  • 일반적으로, pass-by-value로 넘겨도 적은 비용이 든다고 보장할 수 있는 type은 built-in type과 STL iterator 또는 fucntion object type이다.


Summary

  • Prefer Pass-by-reference-to-  const   over pass-by-value. It's typically more efficient and it avoids the slicing problem.
  • The rule doesn't apply to built-in types and STL iterator and function object types. For them, pass-by-value is usually appropriate.

Reference

  • Effective C++ by Scott Meyers

[EC++ 19] Treat class design as type design

  • 다른 OOP 언어들과 마찬가지로, C++에서 새로운 클래스를 만든다는 것은 새로운 타입을 만드는 것과 같다.
  • 좋은 타입의 조건
    • 자연스러운 문법
    • 직관적인 문법
    • 하나 이상의 효율적인 구현 방법이 존재
    • 클래스 멤버 함수를 어떻게 선언되었는가에 따라 그 멤버 함수의 성능이 영향을 받을 수 있다


효율적인 클래스를 디자인하기 위해 생각해봐야 할 점

  • How should objects of your new type be created and destroyed?
  • How should object initialization differ frome object assignment?
  • What does it mean for objects of your new type to be passed by value?
  • What are the restrictions on legal values for your new type?
  • Does your new type fit into an inheritance graph?
  • 어떤 클래스를 상속 받으면 그 클래스의 디자인의 제한 요건을 따르게 되는데, 특히 virtual, non-virtual 과 같은 제한이 그렇다. 만약 자신이 설계한 클래스를 다른 클래스가 상속 받을 수 있도록 허용한다면 어떤 멤버가 virtual일지 결정해야하는데, 특히 destructor를 virtual 로 선언해야 한다.

  • What kind of type conversions are allowed for your new type?
  • What operators and functions make sense for the new type?
  • 어떤 멤버 함수를 제공할 것인가?

  • What standard founctions should be disallowed?
  • 무엇을 private으로 선언할 것인가?

  • Whoshould have access to the members of your new type?
  • What is the "undeclared interface" of your new type?
  • performance와 exception safety, 그리고 resource usage(locks, dynamic memory)에 있어 어떤 보장을 제공할 것인가?

  • How general is your new type?
  • class가 아니라 class template을 만들어야 할 수도 있다.

  • Is a new type really what you need?



Summary

  • Class design is type design. Before defining a new type, be sure to consider all the issues discussed in this Item.

Reference

  • Effective C++ by Scott Meyers