2013-01-05 2 views
6

현재 코드에서 내가 만든 벡터에 새로운 DrawObjects를 삽입하고 싶습니다.차이점 : 벡터 push_back (Object()) 및 push_back (새 Object())?

std :: vector < DrawObject> objects; 차이 란

:

objects.push_back(DrawObject(name, surfaceFile, xPos, yPos, willMoveVar, animationNumber)); 

두 버전 사이

std::vector<DrawObject> objects; 

차이 감안

objects.push_back(new DrawObject(name, surfaceFile, xPos, yPos, willMoveVar, animationNumber)); 
+12

하나는 컴파일되고 다른 하나는 컴파일되지 않습니다. – chris

+0

또는 다른 하나는 Java/C#이고 다른 하나는 C++입니다. – chris

+2

둘 다 컴파일 할 정상적인 방법이 보이지 않습니다 ...'DrawObject'는 단지 _class_입니까? 포인터에서 _convertible _/_ constructible_입니까? –

답변

11

첫번째는, 비 포인터 객체를 추가한다. 그래서 그것은 모두 당신이해야하는 벡터의 선언에 달려 있습니다. 당신이 std::vector<DrawObject>objects를 선언, 그래서 objects 유형 DrawObject하지 DrawObject*의 항목을 저장할 수있는 첫 번째가 작동하기 때문에 귀하의 경우

.

objects.emplace_back(name, surfaceFile, xPos, yPos, 
        willMoveVar, animationNumber); 

주 차이 :

C++ 11에서는, 당신은 emplace_back를 사용할 수 있습니다. 와 비교 : emplace_back

objects.push_back(DrawObject(name, surfaceFile, xPos, yPos, 
          willMoveVar, animationNumber)); 

, 당신은 대신 벡터로 인수를 전달하고, 벡터 내부적 장소에 오브젝트를 구축, 콜 사이트에서 개체를 생성하지 않습니다. 어떤 경우에는 더 빠를 수 있습니다.

컨테이너의 끝에 새 요소를 추가, 말한다 emplace_back (광산을 강조) 대한 문서를 읽어보십시오. 요소가 내부적으로 생성되었습니다. 즉, 복사 또는 이동 작업이 수행되지 않습니다.. 요소의 생성자는 이라는 함수와 정확히 동일한 인수을 사용하여 호출됩니다. 이 사본을 또는 이동을 피할으로

는 결과 코드는 좀 더 빨리 될 수 있습니다.

+0

좋은 작은 지름길 : 구문 외에 어떤 차이가 있습니까? 성능, 또는 이와 비슷한 것. – GigaBass

+0

@ user1896797 : 예, 성능이 향상 될 수 있습니다. * copy * 및 * move *를 피할 수 있습니다. – Nawaz

+1

고맙습니다. 매우 유용한 정보입니다! – GigaBass

1

첫번째가 정확하고, 초이다 하나는 그렇지 않다.

두 번째 버전이 컴파일되면 주석에 표시된대로 기대 한대로 작동하지 않습니다. 또한 DrawObject의 생성자 중 일부를 만드는 것이 좋습니다. explicit.

0

키워드 new을 사용하여 오브젝트를 작성할 때이를 힙에 할당 할 때. 그러면 객체에 대한 포인터가 반환됩니다.

new 키워드없이 개체를 만들 때 스택에 할당되고 해당 개체에 대한 액세스 권한을 얻게됩니다. 첫 번째는 오브젝트 자체 보유 objects 기대하면서

+1

그것은 IMHO와는 무관 한 구현 세부 사항들을 가져 왔습니다. – delnan

+0

@delnan 무식함은 행복합니다. – Caesar

+0

이것은 실제로 * 완전한 * 질문에 대답하지 않습니다. – Nawaz

1

번째 버전은 포인터 DrawObject에의 벡터로 objects 기대. 따라서 objects의 선언에 따라 버전 중 하나만 컴파일됩니다.

objects을 선언 한 경우, 객체를 std::vector< DrawObject*> objects;으로 선언하면 첫 번째 버전 만 컴파일되고 두 번째 버전 만 컴파일됩니다. 두번째는 벡터에 포인터를 추가하면서