2011-01-07 4 views
1

개체의 생성자에 const 값을 전달할 때 참조 또는 값으로 전달해야합니까?
생성자와 초기화 프로그램의 모든 교과서 예제가 값으로 전달되지만 이는 나에게 비효율적 인 것처럼 보입니다.상수 생성자 항목을 참조 또는 값으로 전달해야합니까?

값을 전달하고 인수가 즉시 멤버 변수를 초기화하는 데 사용되면 두 복사본이 만들어 집니까? 이것은 컴파일러가 자동으로 처리하는 것입니까?

class Point { 
public: 
    int x; 
    int y; 
    Point(const int _x, const int _y) : x(_x), y(_y) {} 
}; 

int main() { 
    const int a = 1, b = 2; 
    Point p(a,b); 
    Point q(3,5); 

    cout << p.x << "," << p.y << endl; 
    cout << q.x << "," << q.y << endl; 
} 

올바른

class Point { 
public: 
    int x; 
    int y; 
    Point(const int& _x, const int& _y) : x(_x), y(_y) {} 
}; 

모두 컴파일하고 같은 일을하지만, 대?

+1

'const'를 사용해야 할 때와 사용하지 말아야 할 것에 대해 이야기하는 [GotW article (# 6)] (http://www.gotw.ca/gotw/006.htm)이 있습니다. –

답변

1

여기에서 참조를 전달하고 값을 전달하는 것 중에서 선택합니다. 이 기능 서명은 동일합니다. 매개 변수 값에 의해 전달 될 때 복사본을 항상 만들어으로 매개 변수를 수정할지 여부는 중요하지 않습니다보기의 호출자의 관점에서

Point(int x, int y); 

Point(const int x, const int y); 

.

생성자 외부에서 실제 객체에 대한 참조 또는 포인터를 초기화하려면 참조를 전달해야합니다. 값만 필요하면 값 전달은 대개 객체를 복사하는 비용이 너무 많이 들지 않는 한 바람직합니다. . int의 경우는 그렇지 않습니다.

2

값으로 전달되는 간단한 유형의 경우 괜찮습니다. 단지 몇 바이트의 데이터 만 복사하는 것입니다. 그러나 벡터와 문자열 같은 더 복잡한 유형의 경우 const 참조를 전달하는 것이 좋습니다. 큰 문자열이나 벡터를 복사 할 필요가 없으면 큰 문자열이나 벡터를 복사하는 것은 낭비입니다.

+0

본인은이 사본이 큰 문제는 아니지만 엄밀히 말하면 추가 사본은 완전히 불필요하므로 피해야합니다. 이 객체는 단지 일러스트레이션에 불과하지만 고성능 응용 프로그램에서 수백만 개를 만들어야한다고 말합니다. 이러한 간단한 생성자의 경우 여분의 복사본으로 인해 전체 작업에 대해 두 배의 명령어 호출이 발생할 수 있습니다! 물론 컴파일러가 중복 복사본을 제거 할 정도로 똑똑하지 않은 한. – Mike

+0

나는 대부분의 컴파일러가 이것을 단일 복사본으로 최적화 할 것이라고 생각한다. – GWW

0

int와 같은 간단한 것은 값으로 전달되어야합니다.

큰 개체가있는 경우 불필요한 복사본을 만들지 않으므로 참조로 전달하는 것이 좋습니다.

오브젝트가 변경 가능하다면 참조 또는 사본을 전달할 때 의미 적으로 차이가 있음에 유의하십시오. 이전 경우에는 원본에 대한 변경 사항이 표시되고 후자의 경우 변경 사항은 표시되지 않습니다. const에 대한 참조로 선언 한 경우에도 마찬가지입니다.

1

int과 같은 작은 기본 유형을 참조가 아닌 값으로 전달하는 것이 좋습니다. 올바르게 기억하면 참조가 숨겨진 포인터 (즉, 주소를 전달하고 자동으로 참조 해제)로 장면 뒤에서 구현됩니다. 이는 여전히 포인터 복사 및 오버 헤드 (일부 아키텍처의 경우 int과 동일한 크기)의 오버 헤드가 발생 함을 의미합니다.

잠재적으로 값 비싼 복사 작업을 절약 할 수 있기 때문에 더 큰 사용자 정의 형식에 대해서는 참조로 전달하는 것이 분명합니다.

+0

값이 전달되는 위대한 점은 점과 같은 크기이다. – Mike

관련 문제