2015-04-28 30 views
6

Có một lý do mà tôi thường thấy cấu trúc này:Tôi có nên sử dụng toán tử + = thay cho toán tử + để nối chuỗi std :: string không?

std::string myString = someString + "text" + otherString + "more text"; 

... thay vì điều này (mà tôi rất hiếm khi nhìn thấy):

std::string myString; 
myString += someString += "text" += otherString += "more text"; 

Đọc std::string API, có vẻ như với tôi rằng operator+ tạo ra rất nhiều thời gian (có lẽ được tối ưu hóa bởi trình biên dịch RVO?), trong khi biến thể operator+= chỉ chắp thêm văn bản.

Trong một số trường hợp, biến thể operator+ sẽ là cách để thực hiện. Nhưng khi bạn chỉ cần nối văn bản vào chuỗi không phải là const hiện tại, tại sao không chỉ sử dụng operator+=? Có lý do gì không?

-Rein

+0

Lần cuối tôi đo biểu diễn, nhanh hơn khi thực hiện nhiều '+ =' hơn '=' với nhiều '+' – Morb

+5

Bạn có muốn 'otherString' và' someString' được sửa đổi không? –

+0

Tôi không nghĩ rằng một hình thức sẽ được tối ưu hóa cao hơn khác. Chúng tôi đã sao chép elision và di chuyển ngữ nghĩa ngày nay. @Morb Khi nào là _last time_ thực sự, và bạn đã sử dụng mức tối ưu nào? –

Trả lời

7

operator+= có loại sai của associativity để bạn có thể viết mã như ví dụ thứ hai của bạn. Cho rằng để làm những gì bạn muốn, bạn sẽ cần phải đặt dấu ngoặc nó như vậy:

(((myString += someString) += "text") += otherString) += "more text"; 

Việc thay thế, trong đó cung cấp cho bạn khả năng đọc và hiệu quả mà bạn muốn, là sử dụng std::stringstream:

std::stringstream myString; 
myString << someString << "text" << otherString << "more text"; 
+0

Bỏ qua thực tế đó về sự kết hợp của toán tử. Cảm ơn đã chỉ ra điều đó. – raapeland

1

Xem

std::string aaa += bbb; 

cũng tương tự như

std::string aaa = aaa + bbb; 

để ví dụ của bạn sẽ được thay đổi someStringotherString. Trong trường hợp thông thường, bạn không cần phải lo lắng về thời gian khi sử dụng toán tử + - ở chế độ phát hành, tất cả sẽ bị loại bỏ (RVO và/hoặc tối ưu hóa khác).

+0

Tôi không nghĩ rằng bình luận tối ưu là đúng, nhà điều hành vẫn sẽ được gọi, nó sẽ không kỳ diệu không làm phân bổ bộ nhớ thêm nữa – paulm

+0

Hmm, tất cả các trình biên dịch C++ chính sử dụng tối ưu hóa RVO (bạn có thể đọc về nó trong mô tả trình biên dịch). Tối ưu hóa này phụ thuộc vào các cờ biên dịch: thông thường nó chuyển sang chế độ "debug" và bật trong chế độ "release". Trong trường hợp khác, tất cả các thùng chứa std đều có các hàm khởi tạo được gọi khi không thể áp dụng RVO. Vì vậy, sẽ không có thêm * cấp phát bộ nhớ *. – AeroSun

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