2016-10-06 1 views
2

내 자신의 Matrix 클래스를 작성하고 연산자 + 오버로드에 대해 질문하는 중입니다.C++ 연산자 + 행렬 오버플로

Matrix Matrix::operator+(Matrix &b) 
{ 
    Matrix temp; 
    * 
    * 
    * 
    return temp; 
} 
c = a + b; 

이 아주 잘 작동하지만 내가 조금 걱정 그게 (매트릭스 C) 내가 먼저 임시 매트릭스를 선언는 최종 대상에 복사하는 것이 비효율적입니까? 예를 들어, 다음은 순진한 행렬 덧셈 함수입니다.

void matrixAdd(Matrix& c, Matrix& a, Matrix& b) 
{ 
    c[][]=a[][]+b[][]; 
} 

물론 첫 번째 것은 더 사용하기 쉽지만 두 번째는 더 빠를까요? 그렇다면 첫 번째 개선 방법은 무엇입니까?

+0

고유 한 행렬 클래스를 만드는 이점은 무엇입니까? 나는 glm 라이브러리가 적절하게 이상을 수행한다고 생각한다. – Charlie

+0

@Charlie 아마도 프로그래밍 클래스의 기본 기술을 배우기위한 것이다. – Barmar

+0

'Matrix' 클래스를 어떻게 구현할 수 있는지 살펴 보려면 [GitHub] (https://github.com/ForceBru/Matrix)에서 _Matrix_라는 내 프로젝트를 확인하십시오. – ForceBru

답변

5

귀하의 발췌 문장은 현대적인 컴파일러에서 잘됩니다.

temp의 명백한 전체 복사본을 이라는 기술 (반환 값 최적화)을 사용하여 최적화합니다.

즉, 컴파일러는 첫 번째 코드 단편에서 개선 작업을 수행하고 두 번째 코드 단편은 더 빠르지 않을 것입니다. 자세한 내용은 그렇게 당신이 const 인수에 연산자를 적용 할 수 있습니다

Matrix Matrix::operator+(const Matrix &b) const

에 프로토 타입을 변경하는 것이 좋습니다, 마지막으로하지만

https://en.wikipedia.org/wiki/Return_value_optimization를 참조하십시오.

+0

답장을 보내 주셔서 감사합니다. 행렬 클래스가 라이브러리로 빌드 된 경우에는 차이가 있습니까? –

+0

전혀 반환 값을 최적화하지 않으면 우리 모두가 훨씬 명확한 코드를 작성할 수 있습니다. – Bathsheba

+0

두 방법을 모두 테스트 한 결과 두 번째 방법이 첫 번째 방법보다 30 배 더 빠르다는 것을 알았습니다. –