2013-03-13 33 views
8

Tôi đã đọc Why is there no reallocation functionality in C++ allocators?Is it possible to create an array on the heap at run-time, and then allocate more space whenever needed?, trong đó nêu rõ rằng việc phân bổ lại mảng động của đối tượng là không thể.Một gợi ý phân bổ có được sử dụng không?

Tuy nhiên, trong C++ thư viện chuẩn bởi Josuttis, nó khẳng định một cấp phát, allocator, có chức năng allocate với cú pháp sau

pointer allocator::allocate(size_type num, allocator<void>::pointer hint = 0) 

nơi hint có thực hiện được xác định ý nghĩa, có thể được sử dụng để giúp cải thiện hiệu suất.

Có bất kỳ triển khai nào tận dụng điều này không?

Trả lời

1

C++ 11 tiểu bang, trong 20.6.9.1 thành viên cấp phát:

4 - [Lưu ý: Trong một hàm thành viên container, địa chỉ của một phần tử liền kề thường là một lựa chọn tốt để vượt qua đối số hint. - cuối note]
[...]
6 - [...] Việc sử dụng hint là không xác định, nhưng dự định như là một sự trợ giúp đến địa phương nếu một thực hiện rất mong muốn.

Phân bổ các phần tử mới liền kề hoặc gần với các phần tử hiện có trong bộ nhớ có thể hỗ trợ hiệu suất bằng cách cải thiện địa phương; bởi vì chúng thường được lưu trữ cùng nhau, các phần tử lân cận sẽ có khuynh hướng di chuyển cùng với hệ thống phân cấp bộ nhớ và sẽ không loại bỏ lẫn nhau.

+0

Ah, vậy là để phân bổ các đối tượng cạnh nhau chứ không phải phân bổ lại đối tượng hiện có? –

+0

Bạn không thể vượt qua địa chỉ có sẵn tiếp theo. Gợi ý phải được lấy từ một cuộc gọi trước đó để 'cấp phát'. – Potatoswatter

1

Tôi không chắc về triển khai cụ thể, nhưng lưu ý rằng người cấp phát không được phép trả lại giá trị con trỏ gợi ý trước khi nó được chuyển đến deallocate. Vì vậy, không thể được sử dụng như một hoạt động nguyên thủy để tạo thành một reallocate.

Tiêu chuẩn cho biết gợi ý phải được trả về bằng một cuộc gọi trước đó tới allocate. Nó nói rằng "Việc sử dụng [gợi ý] là không xác định, nhưng nó là nhằm mục đích hỗ trợ cho địa phương." Vì vậy, nếu bạn đang phân bổ và phát hành một chuỗi các khối có kích thước tương tự trên một chuỗi, bạn có thể chuyển giá trị được giải phóng trước đó để tránh sự tranh chấp bộ đệm giữa bộ đệm bộ vi xử lý. Nếu không, khi CPU B thấy rằng bạn đang sử dụng địa chỉ bộ nhớ vẫn còn trong bộ nhớ cache của CPU A (ngay cả bộ nhớ đó chứa các đối tượng đã bị hủy theo C++), nó phải chuyển tiếp dữ liệu rác trên bus. Tốt hơn để cho CPU A và B mỗi tái sử dụng địa chỉ lưu trữ tương ứng của riêng họ.

2

Tôi đã đạt được những lợi thế về hiệu suất đáng kể cho thời gian lặp trên các loại vô hướng nhỏ trong vùng chứa plf::colony C++ của mình bằng cách sử dụng gợi ý với std :: allocator trong Visual Studio 2010-2013 (tốc độ lặp tăng ~ 21%) và tăng tốc nhỏ hơn nhiều GCC 5.1. Vì vậy, nó an toàn để nói rằng với những trình biên dịch và std :: cấp phát, nó làm cho một sự khác biệt. Nhưng sự khác biệt sẽ phụ thuộc vào trình biên dịch. Tôi không nhận thức được tỷ lệ gợi ý bỏ qua để phân bổ quan sát gợi ý.

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