ProgramingTip

C ++에서 돌아가는 가장 좋은 방법은 무엇입니까?

bestdevel 2020. 11. 21. 09:31
반응형

C ++에서 돌아가는 가장 좋은 방법은 무엇입니까?


내 질문은 간단합니다. Man 클래스가 필요한 사람의 이름을 반환하는 멤버 함수를 정의해야 할 두 가지 변형 중 어느 것을 선호해야합니까?

먼저 :

string name();

둘째 :

void name(/* OUT */ string &name);

첫 번째 변형은 불필요한 복사본 (로컬 변수-> 반환 값-> 할당 된 부분의 변수)을 만들기 때문에 비효율적입니다.

두 번째 변종은 꽤 일반적으로 보이지만 글을 쓰기 위해 울게 만듭니다.

string name;
john.name(name);

단순한 대신

string name(john.name());

어떤 변형을 선호해야하며 효율성과 편의성 / 가독성 사이의 적절한 절충점은 무엇입니까?

미리 감사드립니다.


그것은 좋은 질문이고 당신이 그것을 쓰는 사실은 당신이 당신의 코드에주의를 기울이고있는 것을 보여줍니다. 그러나 좋은 소식은 특별한 경우에는 쉬운 방법이 있습니다.

첫 번째, 올바른 방법은 올바른 방법입니다. 컴파일러는 대부분의 경우 (일반적으로 의미가있는 경우) 불필요한 사본을 제거 합니다.

수정 (2016 년 6 월 25 일)

안타깝게도 David Abaraham의 사이트는 몇 년 동안 오프라인 상태였으며 그 기사는 이더들에게 강화되었습니다 (archive.org 사본 사용 불가). 보관 목적으로 로컬 사본을 PDF로 업로드 할 자유를 여기에서 사용할 수 있습니다 .


첫 번째 변형을 사용하십시오.

string name();

컴파일러는 복사본을 최적화 할 가능성이 있습니다. 반환 값 최적화를 참조하십시오 .

C ++ 11에서 이동 의미 체계는 컴파일러가 RVO를 수행하지 않고 수행하는 것도 의미합니다. 이동 의미론을 참조하십시오 .

또한 대안이

void name(std::string& s);

그런 다음 보관할 수있는 일과 s함수에 매우 명확하게 지정 해야 할 일과 유효성 검사를 많이 수행하고 입력을 삭제합니다.


클래스의 필드에 대한 getter를 만들고 싶기 때문에 다음과 같이 가야합니다. inline const std::string& name() const { return this->name; }

이름은 const 참조로 반환 클래스 외부에서 수정되지 않은 이름을 반환하여 생성되지 않습니다.

그 후에 이름을 비용 청구해야합니다.


나는 첫 번째로 갈 것입니다. 반환 값 최적화 및 C ++ 11은 복사 오버 헤드를 제거합니다.


이동 시맨틱 (C ++ 11)이 있으므로 다음을 사용할 수 있습니다.

string name();

C ++ 03 컴파일러가이를 최적화 할 수 있으므로 거의 좋습니다 ( 반환 값 최적화 검색 ).


최적화 규칙 # 1 : 측정 , 최적화, 측정. 또는 Knuth가 말했듯이 "조기 최적화는 모든 악의 근원"입니다.

반환하는 것이 단순히 std::string소프트웨어 성능에 상당한 영향을 미친다 는 강력한 징후가 없다면 그렇게하십시오. 이 할 수 당신있는 경우 측정 상당한 영향을, 경로를 찾아 임계 최적화 것을 . 성능상의 이점이 거의 또는 전혀 없을 가능성이 유지 관리 및 견고성에 영향을 미칠 수있는 재미있는 프로젝트 "최적화"를 만들지 않습니다.


첫 번째 변형을 생각합니다. 이것은 간단한 getter 방법이고 getter / setter 접근 방식이 모든 곳에서 사용되기 때문입니다.

참고 URL : https://stackoverflow.com/questions/10553091/what-is-the-best-way-to-return-string-in-c

반응형