먼저, 몇 가지 경험 법칙 :
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);