Stroustrup은 2013 Going Native 컨퍼런스에서 이에 대해 좋은 의견을 남겼습니다.
이 비디오 에서 약 25m50으로 건너 뛰십시오. . (실제로 전체 비디오를 보는 것이 좋지만 가비지 수집에 대해서는 건너 뜁니다.)
객체를 사용하는 것을 피하고 (명시 적으로) 사용하지 않고 객체와 값을 직접 처리하는 것이 쉽고 안전하고 예측 가능하며 읽기 쉽고 가르치기 쉬운 훌륭한 언어를 사용하는 경우 힙을 사용하면 가비지 수집 조차 원하지 않습니다 .
최신 C ++ 및 C ++ 11에 포함 된 기능을 사용하면 제한된 환경을 제외하고 더 이상 가비지 수집이 바람직하지 않습니다. 사실, 훌륭한 가비지 수집기가 주요 C ++ 컴파일러 중 하나에 내장되어 있어도 자주 사용되지는 않을 것이라고 생각합니다. GC를 피하는 것이 더 어렵지 는 않지만 더 쉬울 것 입니다.
그는이 예를 보여줍니다.
void f(int n, int x) {
Gadget *p = new Gadget{n};
if(x<100) throw SomeException{};
if(x<200) return;
delete p;
}
C ++에서는 안전하지 않습니다. 그러나 Java에서도 안전하지 않습니다! C ++에서 함수가 일찍 반환되면는 delete
호출되지 않습니다. 그러나 Java에서와 같이 전체 가비지 콜렉션이있는 경우, 오브젝트가 "향후 어느 시점에"파괴 될 것이라는 제안 만받을뿐입니다 ( 업데이트 : 이보다 더 나쁩니다. 하지파이널 라이저를 호출 할 것을 약속합니다. 가젯에 열린 파일 핸들, 데이터베이스에 대한 연결 또는 나중에 데이터베이스에 쓰기 위해 버퍼링 한 데이터가있는 경우에는 충분하지 않습니다. 이러한 리소스를 최대한 빨리 확보하기 위해 가제트가 완료 되 자마자 파괴되기를 바랍니다. 더 이상 필요하지 않은 수천 개의 데이터베이스 연결로 데이터베이스 서버가 어려움을 겪고 싶지는 않습니다.
그래서 해결책은 무엇입니까? 몇 가지 접근 방식이 있습니다. 대부분의 객체에 사용할 명백한 접근 방식은 다음과 같습니다.
void f(int n, int x) {
Gadget p = {n}; // Just leave it on the stack (where it belongs!)
if(x<100) throw SomeException{};
if(x<200) return;
}
입력하는 데 걸리는 문자 수가 줄어 듭니다. new
방해 가되지 않습니다 . Gadget
두 번 입력하지 않아도 됩니다. 함수가 끝나면 객체가 파괴됩니다. 이것이 당신이 원하는 것이라면, 이것은 매우 직관적입니다. Gadget
같은 동작합니다이야 int
나 double
. 예측 가능하고 읽기 쉽고 가르치기 쉬운. 모든 것이 '가치'입니다. 때로는 큰 가치가 있지만 포인터 (또는 참조)로 얻는 '먼 거리에서'동작하지 않기 때문에 값을 가르치기가 더 쉽습니다.
대부분의 객체는 객체를 만든 함수에서만 사용되며 자식 함수에 대한 입력으로 전달 될 수 있습니다. 프로그래머는 객체를 반환하거나 광범위하게 분리 된 소프트웨어 부분에서 객체를 공유 할 때 '메모리 관리'에 대해 생각할 필요가 없습니다.
범위와 수명이 중요합니다. 대부분의 경우 수명이 범위와 동일하면 더 쉽습니다. 이해하기 쉽고 가르치기가 더 쉽습니다. 다른 수명을 원할 때, shared_ptr
예를 들어 이것을 사용하여 코드를 읽는 것이 분명해야합니다 . 또는 이동 의미를 활용하거나 값으로 (큰) 객체를 반환하거나 unique_ptr
.
이것은 효율성 문제처럼 보일 수 있습니다. 가제트를 반환하려면 어떻게해야 foo()
합니까? C ++ 11의 이동 의미는 큰 객체를 더 쉽게 반환 할 수있게합니다. 쓰기 Gadget foo() { ... }
만하면 작동하고 빠르게 작동합니다. 당신은 &&
자신 을 엉망으로 만들 필요가 없으며 , 가치로 물건을 반환하면 언어는 종종 필요한 최적화를 수행 할 수 있습니다. (C ++ 03 이전에도 컴파일러는 불필요한 복사를 피하는 데 크게 도움이되었습니다.)
Stroustrup이 비디오의 다른 부분에서 이야기 한 것처럼 (작은 글씨로) : "컴퓨터 과학자 만이 대상을 복사 한 다음 원본을 파괴해야합니다. (컴퓨터 과학자가 아닌) 기대합니다. "
객체의 사본 하나만 필요하다는 것을 보장 할 수 있으면 객체의 수명을 이해하는 것이 훨씬 쉽습니다. 원하는 평생 정책을 선택할 수 있으며 원하는 경우 가비지 수집이 있습니다. 그러나 다른 접근 방식의 이점을 이해하면 가비지 수집이 환경 설정 목록의 맨 아래에 있습니다.
그래도 문제가 해결되지 않으면을 (를) 사용 unique_ptr
하거나 실패 할 수 있습니다 shared_ptr
. 잘 작성된 C ++ 11은 메모리 관리와 관련하여 다른 많은 언어보다 짧고 읽기 쉽고 가르치기 쉽습니다.