먼저, 몇 가지 경험 법칙 :
std::unique_ptr오버 헤드없는 스마트 포인터로 사용하십시오 . 원시 포인터를 자주 사용하지 않아도됩니다. std::shared_ptr대부분의 경우에도 마찬가지입니다. 공유 소유권에 대한 욕구는 종종 소유권에 대한 생각 부족을 배신합니다.
사용하여 std::array고정 길이 배열과 std::vector동적하십시오.
다음과 같은 일반적인 알고리즘을 광범위하게 사용하십시오.
<algorithm>
<numeric>
<iterator>
<functional>
사용 auto하고 decltype()어디서든 가독성을 혜택을 누릴 수 있습니다. 특히, 일을 선언하고 싶지만 반복 자나 복잡한 템플릿 유형과 같이 신경 쓰지 않는 유형의 경우을 사용하십시오 auto. 다른 사물의 유형으로 사물을 선언하려면을 사용하십시오 decltype().
가능하면 물건을 안전하게 보관하십시오. 특정 종류의 일에 대해 불변을 적용하는 주장이있는 경우 해당 논리를 유형으로 중앙 집중화 할 수 있습니다. 그리고 이것이 반드시 런타임 오버 헤드를 유발하지는 않습니다. 또한 C 스타일 캐스트 ( (T)x)는보다 명시적인 (및 검색 가능한) C ++ 스타일 캐스트 (예 :)를 선호하지 않아야합니다 static_cast.
마지막으로 세 가지 규칙이 어떻게되는지 아십시오.
이동 생성자와 이동 대입 연산자를 추가하여 5의 규칙이되었습니다. 그리고 일반적으로 rvalue 참조와 복사를 피하는 방법을 이해하십시오.
그것을 가장 잘 사용하는 방법을 특성화하기 어려운, 그래서 C ++은 복잡한 언어 모든 그것의를. 그러나 좋은 C ++ 개발의 관행은 C ++ 11에서 근본적으로 바뀌지 않았습니다. 수동 메모리 관리보다 메모리 관리 컨테이너를 선호해야합니다. 스마트 포인터를 사용하면이를 효율적으로 수행 할 수 있습니다.
현대 C ++에는 실제로 수동 메모리 관리가 거의 없다고 말하고 싶습니다. C ++의 메모리 모델의 장점은 수동이 아니라 결정적 이라는 것입니다. 예측 가능한 할당 해제는보다 예측 가능한 성능을 제공합니다.
컴파일러의 경우, G ++ 및 Clang은 C ++ 11 기능 측면에서 경쟁력이 있으며 결함을 빠르게 따라 잡습니다. Visual Studio를 사용하지 않으므로 말하거나 반대 할 수 없습니다.
마지막으로, std::for_each일반적으로 피하십시오.
transform, accumulate,와 erase- remove_if기능 옛 좋은 map, fold그리고 filter. 그러나 for_each더 일반적이고 의미가 덜 합니다. 루핑 이외의 의도 는 표현하지 않습니다 . 게다가, 그것은 range-based와 같은 상황에서 사용되며, for포인트 프리를 사용하더라도 구문 적으로 더 무겁습니다. 치다:
for (const auto i : container)
std::cout << i << '\n';
std::for_each(container.begin(), container.end(), [](int i) {
std::cout << i << '\n';
});
for (const auto i : container)
frobnicate(i);
std::for_each(container.begin(), container.end(), frobnicate);