C++ 초보자 여기! 나는 CITIES
의 벡터로 만들어진 WORLD
을 고려중인 코드를 썼다. 이 세상은 nbTimeStep
번 업데이트되었습니다. 여기 내 코드가 어떻게 생겼는지에 대한 대략적인 요약이있다. 독서를 쉽게하기 위해 모든 클래스 이름은 모두 대문자입니다. 함수 ReCreateWorld
프로파일 링 후에벡터를 생성 할 때 여분의 복사를 피하려면 어떻게해야합니까?
WORLD& ReCreateWorld(WORLD& OldWorld, WORLD& NewWorld)
{
for (int city_index=0 ; city_index < NbCities ; city_index++)
{
/* Long Process of creating a single 'CITY' called `city`
...
...
*/
// Add the city to the list of cities (process I am trying to optimize)
NewWorld.AddCity(city);
}
return NewWorld;
}
로 정의
// Definition of Class `WORLD`
class WORLD
{
private:
vector<CITY> cities;
public:
void AddCity(CITY& city)
{
cities.push_back(city);
}
}
// In main
WORLD world(Arguments);
for (int time_step=0 ; time_step < nbTimeSteps ; time_step++)
{
WORLD EmptyWorld;
world = ReCreateWorld(world,EmptyWorld); // The object `EmptyWorld` will be returned after being 'filled' with cities.
}
는 I 볼 그 프로세스에있어서,
AddCity
에 시간의 약 20 %. 주어진의 두 사례가 절대로 필요하지 않으므로 각 도시를 복사하는 데 너무 많은 시간을 낭비하게됩니다.
어떻게이 문제를 해결할 수 있습니까? 아주 우아한 아니므로
일부는 내가 ReCreateCities
에 빈 WORLD
을 통과한다는 사실에 대해 언급 할 수 있습니다. 나는 주로 느린 복사 부분이 줄 cities.push_back(city);
에서 발생하고 ReCreateWorld
이 WORLD
인 경우가 아니라는 것을 강조하기 위해 수행했습니다.
답은'CITY'가 어떻게 생겼는지에 달려 있습니다. 이동할 수 있습니까 (이동 생성자가 있습니까)? –
이동 생성자가 무엇인지 확실하지 않으면'CITY'의 이동 생성자는'CITY (CITY &&);', 두 개의 앰퍼샌드가있는)로 선언 된 생성자가됩니다. –