Nếu bạn sử dụng C++ std :: map (và các vùng chứa khác) với các kiểu giá trị, bạn sẽ nhận thấy rằng chèn vào bản đồ gọi hàm hủy cho kiểu phần tử của bạn. Điều này là do việc thực hiện các operator [] là yêu cầu của C++ spec để được tương đương này:Tại sao không C++ std :: map :: operator [] sử dụng tại chỗ mới?
(*((std::map<>::insert(std::make_pair(x, T()))).first)).second
Nó kêu gọi các nhà xây dựng mặc định của loại hình của bạn để xây dựng cặp đó. Giá trị tạm thời đó sau đó được sao chép vào bản đồ và sau đó bị hủy. Xác nhận điều này có thể được tìm thấy trong this stackoverflow post và here on codeguru.
Điều tôi thấy lạ là điều này có thể được triển khai mà không cần biến tạm thời và vẫn tương đương. Có một tính năng của C++ được gọi là "inplace new". Bản đồ :: std và các vùng chứa khác có thể phân bổ không gian trống cho đối tượng để sống và sau đó gọi rõ ràng hàm tạo mặc định của phần tử trên không gian được phân bổ.
Câu hỏi của tôi: Tại sao không có triển khai std :: bản đồ mà tôi đã thấy sử dụng tại chỗ mới để tối ưu hóa hoạt động này? Dường như với tôi rằng nó sẽ cải thiện đáng kể hiệu suất của hoạt động cấp thấp này. Nhưng nhiều con mắt đã nghiên cứu cơ sở mã STL, vì vậy tôi con số đó phải có một số lý do nó được thực hiện theo cách này.
Trường hợp kiểm tra được bao gồm trong bài đăng stackoverflow được liên kết. Đây là liên kết một lần nữa: https://stackoverflow.com/questions/4017892/in-an-stl-map-of-structs-why-does-the-operator-cause-the-structs-dtor-to – srm
Mike Seymour: Vì vậy, bạn đang đề xuất rằng với trình gỡ lỗi đã tắt, các cuộc gọi thêm vào trình phá hủy sẽ biến mất? Bạn có biết đó là sự thật không? Ngay cả khi nó là đúng, nó có nghĩa là với gỡ lỗi trên, thực hiện là khó khăn hơn để gỡ lỗi (tôi không thể chỉ cần thiết lập một breakpoint trong trình gỡ rối của tôi tìm kiếm các vấn đề phạm vi "thực"). Nó cũng kém hiệu quả hơn trong khi gỡ lỗi, đó là một vấn đề nhỏ hơn, nhưng vẫn còn thực. Cả hai lý do này dường như là lý do để tôi sử dụng thay thế mới cho thư viện cấp thấp như vậy. – srm