계산 시간에 이러한 차이가있는 이유를 다음 코드 (최적화되지 않음)와 함께 설명 할 수 있습니까? 나는 RVO 대 이동 건설을 의심하지만 실제로는 잘 모르겠습니다.자동 루프 및 최적화
일반적으로 이런 경우에 가장 좋은 방법은 무엇입니까? 비 POD 데이터를 초기화 할 때 루프의 자동 선언은 나쁜 습관으로 간주됩니까?
루프 내부 자동 사용 :
std::vector<int> foo()
{
return {1,2,3,4,5};
}
int main()
{
for (size_t i = 0; i < 1000000; ++i)
auto f = foo();
return 0;
}
출력 :
0.17s ./a.out사용자 0.00s 시스템 97 % CPU 0.177 총
루프 외부의 벡터 인스턴스 :
std::vector<int> foo()
{
return {1,2,3,4,5};
}
int main()
{
std::vector<int> f;
for (size_t i = 0; i < 1000000; ++i)
f = foo();
return 0;
}
출력 : 나는 이동 - 건설 대 망막 정맥 폐쇄가 의심
사용자 0.00s 시스템 99 %의 CPU 0.325 총
를 참조하십시오. 이것은 의도 된 것입니까? 오렌지와 오렌지를 비교한다면,'std :: vector f'를 루프 안에 넣으면 안되나요? –
legends2k
이동 건설이 훨씬 빠르다고 생각되면 고유 한 벡터 클래스를 사용하고 이동 생성자를 복사 생성자에 전달하고 다시 측정하십시오. 아니면 어셈블리를보고 그것이 무엇을하고 있는지보십시오. 또는 클래스의 복사/이동 생성자와 할당 연산자에 카운터를 추가하고 실제로 호출 된 것을 확인하십시오. – Useless
또한 : 가짜 벤치 마크 경고. 괜찮은 최적화 '기술'을 가진 컴파일러는 모든 루프를 최적화 할 수 있습니다. – sehe