Hurb Sutter도 인정하듯이 C++는 어려운 언어이다. 그러나, 모든 프로그래머에게 복잡한 것은 아니다. 저질 코드나 라이브러리를 다룰 때와 같은 언어의 가장 난해한 부분에 대해 고려해야 할 것은 극히 한정된 소수의 프로그래머이고, 나머지는 이를 단순히 동작하는 "기본"만으로 사용할 수 있다 라고 그는 말한다.

 

대표적 사례의 하나는 범위 for 루프의 이용이다. 다음과 같은 기술도 가능하지만,

for (auto i = begin(c); i != end(c); ++i) { ... }

최근 C++ 라면 같은 것을 더 쉽게

for (auto& e : c) { ... }

라고 기술하고, 가독성도 뛰어나다.

 

 

포인터, 참조, new delete

또 하나 그가 적극 권장하는 것은 저 수준의 데이터 구조 내에 캡슐화 되는 것을 제외하고, 포인터 변수 *의 소유니 new, delete를 사용하지 않아야 한다는 것이다. unique_ptr를 사용하거나 공유가 필요하다면 shared_ptr을 사용하는 것이 바람직한 방법이라고 그는 말한다. 다음과 같이 간단하게 기술하면 된다.

auto p = make_unique<widget>();

auto q = make_shared<widget>();

make_uniquemake_shared 사용하면 delete에 대해 신경 쓸 필요가 없어진다.

 

그러나 *&가 없으면 자원 사용량이 크게 된다. 2개의 최적인 활용 사례는 함수 전달 파라미터이다. 진짜 안티 패턴이라고 그가 생각하는 것은 파라미터 인수에 변수 참조 카운트를 사용하는 것이다. 이것은 단순히 성능 문제의 원인이 될 뿐이며, 래퍼 객체의 소유를 양도할 목적에서만 사용되어야 할 것이다.

 

 

로컬 변수 선언에 auto를 사용

auto 키워드는 현대적인 C++의 기능으로서 가장 중요한 것 중 하나라고 그는 말한다. auto는 변수형을 추론할 뿐만 아니라 사용되는 형식을 특정하기 위해서도 사용할 수 있다. 이런 구절을 생각해 보자.

auto i = v.begin();

이것에 의해 사용된 형태가 정확히 추론된다. 다음과 같은 기술보다 훨씬 간단하여 어려운 일을 생각할 필요도 없다.

vector::const_iterator i = v.begin();

여기에서는 특히 const_iterator 이용도 고려하지 않으면 안 된다.


이러한 정확함이 auto 최대의 장점이지만 그 가치는 다른 측면에도 있다.

  • 관리성: 함수의 반환 값 등 변경을 쉽게 적응할 수 있는 코드이다.
  • 퍼포먼스: 정확한 추론의 결과로서 객체의 초기화 시 등에서 일시적 객체가 부주의에 생성되지 않는 것도 보증할 수 있다.
  • 사용성: 람다와 같은 특수 상황에 대해서 auto는 불가결한 factor 이다.
  • 형 편리성(Type Convenience): 몇 가지 키워드를 생략할 수 있다.

 

다만 C언어의 배열을 다루는 경우나 이동이 불가능 또는 쉽지 않은 형 등 auto를 사용할 수 없는 사례도 여럿 있다.

auto lock=lock_guard<mutext>{m}; // 에러:이동 불가

auto ai=atomic<int>{}; // 에러:이동 불가

auto a=array<int, 50>{} ;// 옳지만 비용이 높다

 

 

파라미터 전달

그의 강연에서는 파라미터 전달 설명에 많은 시간을 할애하고 있었다. 여기서 주된 포인트는 C++98의 기본이 현재의 C++에 계속 유효하고 그 출발점이기도 한 반면, 우측 값 최적화에 따라 몇 가지 기능이 추가돼 있다는 것이다. 일례로, 항상 해야 하는 것은

class employee{

      std::string name_;

public:

      void set_name(const std::string&name){name_=name;}//C++98의 표준적인 기술 방법

      void set_name(std::string&&name)noexcept{name_=std::move(name);}//우측 값 최적화

};

그는 값 전달은 주로 생성자에서 사용하도록 제안한다. 그것 이외의 값 대입 호출은 우변 최적화가 할 수 있지만 이름 있는 파라미터로 줄 때(즉 일시적 객체)의 성능 손실이 커질 가능성이 있기 때문이다.

 

 

Tuple

마지막 제안은 반환 값으로서 Tuple(튜플)의 이용에 관한 것이다.

tie(iter, success) = myset.insert("Hello");

if (success) do_something_with(iter);

 

 

기본과 이데옴 강조에 덧붙여 그는 지나치게 난해한 솔루션에 도달하는 경우가 많은 과도한 고려를 피해라고 말했다. 대부분 그의 제안은 프로그램 언어가 가장 기본적인 차원에서 제공하는 기능 이용을 원칙으로 한 후, 꾸준한 시행 착오에 의한 성능 향상의 노력에 걸맞은 성과가 기대할 수 있는 터전을 신중히 선택해 내고 있는 것이다.

 

 

 

출처: http://www.infoq.com/news/2014/10/modern-cpp-essentials

저작자 표시
신고
by 흥배 2014.12.01 08:00
| 1 |

티스토리 툴바