>source

다음 예를 최적화하려면 어떻게 해야 합니까? 이것의 문제는 가상 테이블에 대한 호출이 매우 많고 "스택에 있는" 벡터 기능을 적절하게 활용할 수 없다는 것입니다. 푸시백을 통해 이 예제에서 하는 것처럼 벡터를 초기화하면 메모리의 다양한 위치에 저장해야 하므로 사용 시 성능 향상을 잃게 됩니다.표준::벡터조금도.

#include <iostream>#include <vector>#include <memory>class SimulationObject {
public:
    SimulationObject()= default;
    virtual void Update() {
        std::cout << "Update SimulationObject!" << "\n";
    }
};
class Foo : public SimulationObject {
public:
    void Update() override {
        std::cout << "Update Foo!" << "\n";
    }
};
class Bar : public SimulationObject {
public:
    void Update() override {
        std::cout << "Update Bar!" << "\n";
    }
};
int main() {
    std::vector<std::shared_ptr<SimulationObject>> obj_list{};
    obj_list.push_back(std::make_shared<SimulationObject>());
    obj_list.push_back(std::make_shared<Foo>());
    obj_list.push_back(std::make_shared<Bar>());
    for (const auto &amp;
obj: obj_list) {
        obj->Update();
    };
    return EXIT_SUCCESS;
}

이 문제를 해결하는 일반적인 방법이 있습니까? 내가 생각할 수 있는 유일한 방법은 모든 어린이에 대해 독립적으로 벡터를 만드는 것입니다. 그러나 이것은 새로운 것을 추가할 때 복잡성이 추가된다는 단점이 있습니다.SimulationObject-어린이들.

다체 시뮬레이션 또는 에이전트 기반 시뮬레이션(SRI 모델링과 같은)의 관점에서 이것을 보고 있습니다.

업데이트이러한 경우에 대한 방법은 다음과 같습니다(에이전트 기반).

void Update(double &amp;
dt) override {
        position_ += dt * velocity_;
}

여기서 차선책이 무엇인지 정확히 알 수 없습니다.

500 - Internal Server Error2022-01-17 13:09:44

@500-InternalServerError : 가상 테이블을 통해 메서드에 대한 반복적인 호출과 스택에 개체를 저장하지 않고 메모리의 임의의 위치에 저장합니다.

DeerFreak2022-01-17 13:11:49

이것이 실제로 문제/병목 현상인지 확인했습니까?

500 - Internal Server Error2022-01-17 13:13:05

예 -Update 내의 업데이트가 매우 작기 때문에 실제로 병목 현상이 발생합니다.

DeerFreak2022-01-17 13:14:54

어쩌면 Update() 함수에서 일어나는 일이 더 흥미로울 수도 있습니다. 루프도 포함되어 있으면 가장 자주 수행되는 가장 내부 루프의 본문입니다...

Scheff's Cat2022-01-17 13:14:58
  • 이전 Zxing.net은 qr code xamarin.android null 참조를 생성합니다.
  • 다음 javascript : CSS 변수 상속 방지 || 사용하지 않는 CSS 속성?