std::realloc
là nguy hiểm trong C++ nếu bộ nhớ malloc'd chứa các loại không phải nhóm. Có vẻ như chỉ có vấn đề là std::realloc
sẽ không gọi loại destructors nếu nó không thể phát triển bộ nhớ tại chỗ.Sử dụng realloc trong C++
Một công việc tầm thường xung quanh sẽ là một hàm try_realloc
. Thay vì malloc'ing bộ nhớ mới nếu nó không thể được trồng tại chỗ, nó chỉ đơn giản là sẽ trở về sai. Trong trường hợp đó bộ nhớ mới có thể được cấp phát, các đối tượng được sao chép (hoặc di chuyển) sang bộ nhớ mới, và cuối cùng là bộ nhớ cũ được giải phóng.
Điều này có vẻ vô cùng hữu ích. std::vector
có thể tận dụng tối đa điều này, có thể tránh tất cả các bản sao/phân bổ lại.
khả năng chống cháy trước: Về mặt kỹ thuật, đó là hiệu suất Big-O, nhưng nếu tăng trưởng vectơ là cổ chai trong ứng dụng của bạn, tốc độ x2 sẽ tốt hơn ngay cả khi Big-O không thay đổi.
NHƯNG, tôi không thể tìm thấy bất kỳ api nào hoạt động như try_realloc
.
Tôi có thiếu gì đó không? Có phải try_realloc
không hữu ích như tôi tưởng tượng không? Có một số lỗi ẩn khiến try_realloc
không sử dụng được không?
Tốt hơn, Có một số API ít tài liệu hoạt động như try_realloc
không?
LƯU Ý: Tôi rõ ràng là trong mã cụ thể của thư viện/nền tảng tại đây. Tôi không lo lắng vì try_realloc
vốn đã là một tối ưu hóa.
Cập nhật: Sau Steve Jessops bình luận là về việc liệu vector
sẽ hiệu quả hơn sử dụng realloc Tôi đã viết lên một bằng chứng của khái niệm để kiểm tra. Các realloc-vector
mô phỏng mô hình tăng trưởng của một vector nhưng có tùy chọn để realloc thay thế. Tôi chạy chương trình lên đến một triệu phần tử trong vectơ.
Để so sánh, vector
phải cấp phát 19 lần trong khi phát triển thành một triệu phần tử.
Kết quả, nếu realloc-vector
là điều duy nhất sử dụng đống kết quả là tuyệt vời, phân bổ 3-4 trong khi phát triển đến kích thước triệu byte.
Nếu realloc-vector
được sử dụng cùng với vector
tăng trưởng ở tốc độ 66% tốc độ realloc-vector
Kết quả kém hứa hẹn, phân bổ 8-10 lần trong quá trình tăng trưởng.
Cuối cùng, nếu realloc-vector
được sử dụng cùng với số vector
tăng cùng tốc độ, số realloc-vector
sẽ phân bổ 17-18 lần. Chỉ tiết kiệm một phân bổ cho hành vi vectơ chuẩn.
Tôi không nghi ngờ rằng một hacker có thể phân bổ kích thước trò chơi để cải thiện khoản tiết kiệm, nhưng tôi đồng ý với Steve rằng nỗ lực to lớn để viết và duy trì người cấp phát đó không hoạt động.
Rất khó để cung cấp đề xuất cụ thể cho nền tảng mà không có ý tưởng về nền tảng bạn muốn nhắm mục tiêu. –
Mục tiêu của tôi là gcc + Linux. Tuy nhiên, tôi thường tò mò vì vậy một giải pháp trên bất kỳ nền tảng nào sẽ được xem xét. –
Tôi không thể không nghĩ: Nếu bạn muốn có hiệu suất tốt nhất, hãy sử dụng vector.reserve() để bạn không phải phát triển vectơ. –