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
'ProgramingTip' 카테고리의 다른 글
Backbone.js에서 뷰 및 모델 폐기 (0) | 2020.11.21 |
---|---|
새 사용자 정의 컨트롤을 도구 상자 나 새 Winform에 어떻게 추가 할 수 있습니까? (0) | 2020.11.21 |
루비에서 to_s 대 to_str (그리고 to_i / to_a / to_h 대 to_int / to_ary / to_hash) (0) | 2020.11.21 |
webSocket을 사용하여 특정 사용자에게 메시지를 보내 시나요? (0) | 2020.11.21 |
java.lang.NumberFormatException을 어떻게해야합니까? 입력의 경우 :“N / A”? (0) | 2020.11.21 |