2014-06-23 6 views
0

저는 C++을 처음 사용하고 있으며 작업중인 특정 프로젝트에 다형성을 사용하는 방법을 알아 냈습니다.C++ 추상 기본 클래스를 사용하여 다형성을 달성하기 위해 객체 재사용

구성 요소 목록이 있습니다. 각 구성 요소에는 논리를 사용하여 계산 된 점수가 있습니다. 이 추상 기본 클래스에서

class Component { 
    public: 
     int compute_score(request *r) =0; 
     int get_score() { return score; } 
    protected: 
     int score; 
}; 

이제 모든 구성 요소 상속 구성 요소 점수를 계산하기 위해 자신의 논리를 구현하기 : 그래서 추상 클래스가 있습니다. 그리고 마지막 알고리즘은 모든 컴포넌트 점수를 결합하는 것입니다.

// Compute and combine scores 
for (int ndx = 0; ndx < num_components; ndx++) { 
    total += components[ndx]->compute_score(); 
} 
combined_score = total/num_components; 

이제이 모델을 기존 코드 기반에 맞추려고합니다. 이 Component 객체를 추가하고 점수를 계산하려는 request라는 큰 구조체가 있습니다. 구성 요소 배열을 사용하는

struct request { 
    ... 
    Component *components[num_components]; 
    ... 
}; 

void serve(request *r) { 
    ... 
    // Compute and combine scores 
    for (int ndx = 0; ndx < num_components; ndx++) { 
     total += components->compute_score(); 
    } 
    combined_score = total/num_components; 
    ... 
} 

// Listener 
void start(request *r) { 
    // Listen for request 
    // Serve the request 
    serve(&r); 
    // Clear the request struct for reuse 
    memset(r, 0, sizeof(request)); 
} 

int main() { 
    // Created only once and then reused 
    request *req = (request*) calloc(1, sizeof(calloc)); 
    start(&req); 
} 

가능성 :

  1. ) (제공하는 전화를 동적으로 요청이 들어 오면마다 할당 된 메모리 무료이 접근하는 동안 동적으로 컴포넌트 서브 클래스 객체를 생성합니다. 모든 요청마다 객체가 생성되고 성능이 저하 될 수 있습니다 (할당 & 할당). 메모리 조각화가 발생할 수 있습니다.

  2. 요청 개체 내에 구성 요소 하위 클래스 개체를 정적으로 만들고 구성 요소 배열에 대한 해당 참조를 가리 키십시오. 이것이 좋은 생각인지는 모르겠지만 동일한 객체를 재사용하여 문제를 해결합니다. 그리고 간단하고 우아한 방법으로 이것을 달성하는 방법을 모르겠습니다. 어떤 제안이라도 도움이 될 것입니다.

감사

+0

"먼저 구성 요소 목록이 있습니다"라고 말한 다음 나중에 사용하려면 하위 클래스 개체를 만들어야한다고 말합니다. 필자의 이해를 돕기 위해 배열의 포인터는 기존 구성 요소 (어느 시점에서 어떤 방식 으로든 만들어 졌음)를 가리 킵니다. 나에게 상황이 무엇인지는 분명하지 않다. 즉, 컴포넌트를 색인화하고 요청을 전달하기를 원할 것입니다. 나는. ('components [ndx] -> compute_score (r)'). –

+0

모든 구성 요소 개체를 한 번만 만들고 모든 요청에 ​​대해 동일한 항목을 다시 사용하고 싶습니다. 모든 개체가 같은 구조체에 있으면이 개체를 가리키는 포인터를 배열에 만드는 좋은 방법이 있습니까? – mariner

답변

1

먼저 가장 간단한 해결책를 수행합니다.

옵션 1 히트 성능. 그것은 큰 일 수도 있고 일 수 있습니다. 내가 너라면 그 방법이 더 간단하기 때문에 사용할거야.

경우 성능 문제가 발생하고 경우에만 다음을 일으키는 당신이 솔루션을 최적화 고려해야 할당 & 무료입니다 증명할 수 있습니다.

마지막으로 원하는 것은 불필요하게 복잡한 코드입니다.

+0

그 두 번째. 고속 거래를하지 않거나 Wunderfon의 2 억 송장을 하룻밤 만 계산하기를 원하지 않는 한, 메모리 관리 오버 헤드는 거의 걱정할 필요가 없습니다. 그러나 나는 아직도 prob를 이해하지 못한다. 포인터가 구조체의 멤버를 가리켜 야하는 경우 : 예, 가능합니다. 왜 안 되니?벡터 사용을 고려해보십시오. –

+0

예 내 응용 프로그램은 하루에 약 5 억 건의 요청을 처리합니다. 약 6000/초. 그래서 나는 더 나은 접근 방법이 무엇인지 염려합니다. 동적 할당을 통해 더 나은 이해를 얻으려면 성능에 어떤 영향을 미치는지 살펴볼 것입니다. – mariner

관련 문제