2009-11-30 2 views
1

나는 덧셈, 곱셈, 뺄셈, 나눗셈 등의 연산자를 가진 벡터 클래스를 가지고있다. 나는 벡터 연산을 많이하는 프로그램을 최적화하려고 노력하고 있으며, 약 50 %의 시간이 벡터를 생성하고 파괴하는 것을 깨닫고있다. 나는 이것이 벡터에 대해 복합이 아닌 수학 연산자를 호출 할 때마다 새로운 벡터가 구성된다는 것을 이해합니다. 복합 연산자를 사용하거나 벡터 연산을 확장하지 않고이를 방지 할 수있는 방법이 있습니까?복합 작업이 아닌 동안 공사를 막을 수있는 방법이 있습니까?

내가있는 경우 : C 완전히 새로운 벡터이기 때문에

Vector a = Vector(x, y, z); 
Vector b = Vector(a, b, c); 

Vector c = a + b; 

내가 + = 사용할 수 없습니다. 나는이와 속도를 높일 수 있습니다 알고

c.x = a.x + b.x; 
c.y = a.y + b.y; 
c.z = a.z + b.z; 

을하지만, 단지 연산자를 사용하여로 그 깨끗하지 않는 것 같습니다.

답변

2

나는 이것이 내가 벡터에 대한 비 화합물 수학 연산자를 호출 할 때마다하는 새로운 벡터 구성되어 때문이라고 이해합니다. 복합 연산자를 사용하거나 벡터 확장 벡터 을 사용하지 않고이 문제를 방지하려면 방법이 있습니까?

글쎄, 당신은 세 번째 일을 구성 할이 요구하는 세 번째 일을 생산하기 위해 함께 두 가지를 추가하는 성격은 ... 그래서 어떻게도 논리적으로 가능 무엇을 요구하고 있는가?

덧셈 연산자를 사용하여 생성 된 임시 변수가 염려된다면 컴파일러가 반환 값 최적화를 지원할 경우 컴파일러가 최적화 할 수 있습니다. 또는 컴파일러가 이것을 지원하지 않고 임시 변수를 줄이려고하지만 + 연산자를 유지하려는 경우 C++ 0x 이동 의미를 에뮬레이트하고 벡터에 rvalue 이동 생성자를 제공 할 수 있습니다. 값으로 임시를 리턴 할 때 호출됩니다. C++ 03에서 move semantics 구현에 대한 정보는 this article의 "객체 이동"절을 참조하십시오. C++ 0x가 나온 후에는 오른쪽 값 참조에 && 연산자를 사용하여 실제 이동 생성자로이 해킹을 대체 할 수 있습니다.

+0

제 3의 벡터가 이미 구성되었다고 가정하십시오. 나는 그 구성 요소를 수정하기 만하고, 새로운 벡터를 만들지 않고, 새 벡터의 구성 요소를 이미 생성 된 구성 요소로 복사하는 것이 아니다. 이것은 낭비입니다. 또한 한 줄에 여러 작업을 수행하는 경우 이러한 각 작업에 대해 필요없는 새로운 벡터가 만들어집니다. – Stewart

+1

생성 된 임시 객체를 줄이는 확실한 방법은 Vector 클래스에 move 생성자와 move 대입 연산자를 구현하여 C++ 0x 이동 시멘틱을 에뮬레이트하는 것입니다. MyVector_move_t 클래스 나 무엇이든간에 반환 할 임시 객체를 래핑해야합니다. 이 작업에 대한 자세한 내용은 내가 편집 한 포스트에서 언급 한 기사를 참조하십시오. 가장 좋은 점은 C++ 0x가 발생하면 가짜 이동 생성자를 실제 이동 생성자로 바꿀 수 있다는 것입니다. –

1

최적화가 켜져 있고 컴파일러가 RVO을 적용하고 있는지 확인하십시오.이 상황은 정확히이 상황을 위해 설계되었지만 사용할 필요는 없습니다. (컴파일러가 RVO를 인식하고 적용하는 데 도움이되는 op + 구현에서 NRVO 형식을 사용해야 할 수도 있습니다.) 또한 blitz++을 보았습니까?

Vector operator+(Vector const& a, Vector const& b) { 
    Vector nrvo; 
    // or: Vector nrvo (ctor, parameters, here); 
    //... 
    return nrvo; 
} 

같은 연산을 명시 적으로 사본을 수행 한 후 사용하여 너무 다른 대안이있다 + =, 망막 정맥 폐쇄가 적용되지 않는 경우 상황에서 제공되는 :

Vector c; // created somewhere else, and we want to assign to it 
// instead of create it "in-place" as RVO does 

Vector a, b; 
// instead of: 
//c = a + b 
// use: 
c = a; 
c += b; 

이 될 수 있습니다 blitz ++처럼 expression templates으로 구문을 변경하지 않고 c = a + b에서 변경했습니다.

1

우와. 코드가 완전히 비효율적입니다.

Vector a = Vector(x, y, z); 
Vector b = Vector(a, b, c); 

비효율적입니다.당신이 쓰고 싶은 것은

Vector a(x, y, z); 
Vector b(a, b, c); 
관련 문제