2017-12-04 7 views
2

ストリートのリストを含む都市のリストを含む国のリストがあるコードを考えてみましょう。与えられたCountryの各CityStreet S(nbStreetsPerCity)の正確に同じ数が含まれており、Cityあたり通りのこの数は、時間にわたって一定です。オブジェクトをOOPを失うことなくメモリ内で連続させる方法は?

class Street 
{ 

}; 

class City 
{ 
    // Attribute 
    std::vector<Street> Streets; 

    // getter 
    Street& getStreet(int street_index) {return Streets[street_index];} 
    // More stuff 

}; 

class Country 
{ 
    // Attribute 
    std::vector<City> Cities; 

    // getter 
    City& getCity(int city_index) {return Cities[city_index];} 

    // More stuff 

}; 

私は各Streetをループしており、プロセスが、私は多くのStreet sおよび少数City IEを持っている場合、非常に高速ですが、私はいくつかのStreet

などで持つ多くのCity IEを持っているときはかなり遅いですコードStreetは、CountryのすべてがCountryであり、メモリ内で連続していません。パフォーマンス上の理由から、Countryのすべてがメモリ内で連続しているようなコードを試してみたいと思います。私は、オブジェクト指向プログラミングの一部を破壊することなくメモリ内にすべてのオブジェクトを連続させる方法を考えることはできません。そのようなコードで

class Street 
{ 

}; 


class Country 
{ 
    // Attribute 
    std::vector<Street> Streets; 
    int nbStreetsPerCity; 

    // getter 
    City getStreet(int city_index, int street_index) 
    { 
     Streets[city_index*nbStreetsPerCity + street_index] 
    }; 

    // More stuff 

}; 

、所与の国の全てStreet Sは、しかし、私はCityオブジェクトを失い、したがって、OOPの利点を失って、メモリ内に連続しています。

OOPの利点を失うことなく、メモリ内で連続しているすべての通りを持ってする方法はありますか?

非常に簡単な例が大歓迎です!

+0

'std :: vector'は、連続したメモリを使用するために*保証されています。 –

+1

@JesperJuhlはい、しかし 'std :: vector >'は(私が間違っていないならば)連続したメモリを使わないことが保証されています。そのような 'std :: vector 'は、 'City'の唯一の属性が' std :: vector 'であるため、すべての' Street'がメモリ内で連続していないことを保証します(与えられた 'City ')です。私は正しい?街が少ない都市がたくさんあると、パフォーマンス上の問題が発生する可能性があります。私の問題はあなたに合っていますか?ありがとう –

+0

すべての通りを一緒にメモリに保存して解決しようとしている問題は何ですか? –

答えて

0

このようなファンアウトの最も低いレベルで行うことはできますが、大きな苦痛になることがあります。割り当て前に街にいくつの街があるかを知る必要があります。等しいサイズのオブジェクトでなければなりません(ストリート名は最大長を意味します)。

都市オブジェクトの最後にベクトルを置き、ゼロサイズの配列で置き換えます。新しい配列を割り当てる代わりに、mallocやその他のアロケータを使用してからnewを使用して都市を初期化する必要がありますそのバッファに入れます。その後、ステートのリストを通り、実際に都市オブジェクトの後に出てくる配列にコピーします。

私が言ったように、それはできますが、痛みです。あなたは実際にそのような道を下る前に何かのような何かをする理由があることを確かめてください。

2

これを行う方法は、通りのベクトルを含む 'StreetManager'を持つことです。あなたの街と国には、あなたのストリートマネージャーが保持するストリートへの参照が含まれています。

私が '参照'と言うとき、これらは単なるインデックスでも、あなたの読み取り/書き込みの要件に応じてルックアップを許可する何らかのIDでもかまいません。
読み書きの要件によって、ベクトル編集で参照が壊れてしまい、ベクトルが削除されてインデックスが壊れてしまい、idがマネージャによって管理されているid - > indexのマップを必要とするという事実を参照します。あなたの町/国の

機能「getStreets」はちょうどマネージャーにインデックス/ idを渡して結果を返す必要があります。

心に留めべき重要なことは、管理者に街の#を編集しようとすると、破壊されるすべての参照をもたらすことです。

関連する問題