2013-01-05 57 views
6

Trong mã hiện tại của tôi, tôi muốn chèn DrawObject mới vào một vectơ mà tôi đã tạo,Sự khác biệt về std :: vector push_back (Object()) và push_back (new Object())?

std :: vector < DrawObject> objects;

sự khác biệt giữa là gì:

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

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

Một người sẽ biên dịch, người kia sẽ không. – chris

+0

Ngoài ra, với thiết lập đó, một là nhiều Java/C# và một là C++. – chris

+2

Tôi không thấy bất kỳ cách nào mà cả hai người trong số họ sẽ biên dịch ... Có phải 'DrawObject' chỉ là một _class_? Có _convertible _/_ constructible_ từ con trỏ không? –

Trả lời

11

Đầu tiên thêm đối tượng không phải là con trỏ, còn đối tượng thứ hai thêm con trỏ vào vectơ. Vì vậy, tất cả phụ thuộc vào việc khai báo của vectơ mà bạn nên làm.

Trong trường hợp của bạn, vì bạn đã tuyên bố objects như std::vector<DrawObject>, vì vậy một trong những đầu tiên sẽ làm việc, như objects có thể lưu trữ các mặt hàng loại DrawObject, không DrawObject*.

Trong C++ 11, bạn có thể sử dụng emplace_back như:

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

Lưu ý sự khác biệt. Hãy so sánh nó với:

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

Với emplace_back, bạn không xây dựng các đối tượng tại các cuộc gọi tại chỗ, thay vào đó bạn vượt qua các đối số vector, và vector trong nội bộ xây dựng các đối tượng tại chỗ. Trong một số trường hợp, điều này có thể nhanh hơn.

Đọc doc về emplace_back mà nói (nhấn mạnh của tôi),

Gắn một yếu tố mới để kết thúc container. Phần tử được tạo tại chỗ, tức là không có thao tác sao chép hoặc di chuyển nào được thực hiện. Hàm khởi tạo của phần tử được gọi với chính xác cùng một đối số được cung cấp cho hàm.

Vì nó tránh bản sao hoặc di chuyển, mã kết quả có thể là nhanh hơn một chút.

+0

Phím tắt nhỏ đẹp ở đó: bất kỳ sự khác biệt nào, ngoài cú pháp? Giống như, hiệu suất hoặc một cái gì đó tương tự. – GigaBass

+0

@ user1896797: Có, nó có thể cải thiện hiệu suất, vì nó tránh được * sao chép * và thậm chí là * di chuyển *. – Nawaz

+1

Cảm ơn bạn, thông tin rất hữu ích! – GigaBass

1

Với

std::vector<DrawObject> objects; 

Sự khác biệt giữa hai phiên bản là một trong những đầu tiên là chính xác, và lần thứ hai một là không.

Nếu phiên bản thứ hai biên dịch, như bạn chỉ ra trong các nhận xét, nó không làm những gì bạn mong đợi có thể. Nó cũng gợi ý rằng bạn có lẽ nên xem xét việc thực hiện một số nhà thầu của DrawObjectexplicit.

0

Khi bạn tạo đối tượng bằng cách sử dụng từ khóa new, hãy phân bổ đối tượng đó trên heap. Điều này sẽ trả về một con trỏ tới đối tượng.

Khi nào khi bạn tạo đối tượng không có từ khóa new, nó sẽ được cấp phát trên ngăn xếp và bạn sẽ có quyền truy cập vào đối tượng đó tại chỗ.

+1

Điều đó mang lại rất nhiều chi tiết triển khai không liên quan IMHO. – delnan

+0

@delnan Vô minh là phúc lạc. – Caesar

+0

Điều này không thực sự trả lời câu hỏi * hoàn toàn *. – Nawaz

1

Phiên bản thứ hai mong đợi objects là vector của con trỏ để DrawObject, trong khi phiên bản đầu tiên mong muốn objects để giữ các đối tượng. Vì vậy, tùy thuộc vào tuyên bố của objects chỉ một trong các phiên bản sẽ biên dịch.

Nếu bạn khai báo objects cách bạn đã làm, chỉ phiên bản đầu tiên sẽ biên dịch, nếu bạn khai báo các đối tượng là std::vector< DrawObject*> objects; chỉ phiên bản thứ hai sẽ biên dịch.

Các vấn đề liên quan