0

私は2つのクラスを持っています。スーパークラスは「Component」クラスで、サブクラスは「Transform」クラスです。

私が使用しているフレームワークには、特定のタイプのコンポーネントのリストを返す関数があります。ただし、タイプは特定のサブクラスに制限されていないため、リストはコンポーネントとしてそれらを返します(ただし、それは私が使用している方法です)。

したがって、次のシナリオでは、返されるすべてのコンポーネントが Transform サブクラスになることがわかっています。私がやっていることは、リストを反復処理してから、各コンポーネントを Transform にキャストすることです。これが私のコードです:

std::list<Cistron::Component*,std::allocator<Cistron::Component*>> playerTransforms = objectManager->getComponents(player,"Transform");
std::list<Cistron::Component*>::iterator playerComponentIterator = playerTransforms.begin();
for (playerComponentIterator; playerComponentIterator != playerTransforms.end(); playerComponentIterator++)
{
    Transform *tmpTransform = static_cast<Transform*> (*playerComponentIterator);
    std::cout << tmpTransform->x ;
    std::cout << tmpTransform->y ;
}

これはどのくらい効率的ですか?私はC++を初めて使用するので、これを行うためのより良い方法があるかどうかわかりません。

4

2 に答える 2

1

は通常、二重連結リストとして実装されます。std::listこれは、要素がメモリ全体に散らばっていることを意味し、反復処理が遅くなることを意味します。チェック:大きな std::list の反復処理が遅いのはなぜですか?

しかし、私がもっと心配しているのは、リフレクションの使用です。

objectManager->getComponents(player,"Transform");

それが、このコードの本当のボトルネックかもしれません。

于 2013-11-03T12:59:16.873 に答える