ストリートのリストを含む都市のリストを含む国のリストがあるコードを考えてみましょう。与えられたCountry
の各City
はStreet
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の利点を失うことなく、メモリ内で連続しているすべての通りを持ってする方法はありますか?
非常に簡単な例が大歓迎です!
'std :: vector'は、連続したメモリを使用するために*保証されています。 –
@JesperJuhlはい、しかし 'std :: vector>'は(私が間違っていないならば)連続したメモリを使わないことが保証されています。そのような 'std :: vector 'は、 'City'の唯一の属性が' std :: vector 'であるため、すべての' Street'がメモリ内で連続していないことを保証します(与えられた 'City ')です。私は正しい?街が少ない都市がたくさんあると、パフォーマンス上の問題が発生する可能性があります。私の問題はあなたに合っていますか?ありがとう –
すべての通りを一緒にメモリに保存して解決しようとしている問題は何ですか? –