Tôi đang quá tải operator new
, nhưng gần đây tôi đã gặp sự cố với căn chỉnh. Về cơ bản, tôi có một lớp học IBase
cung cấp operator new
và delete
trong tất cả các biến thể bắt buộc. Tất cả các lớp bắt nguồn từ IBase
và do đó cũng sử dụng các trình phân bổ tùy chỉnh.điều hành quá tải mới và căn chỉnh
Vấn đề tôi đang gặp phải bây giờ là tôi có một con Foo
phải được căn chỉnh 16 byte, trong khi tất cả những thứ khác đều ổn khi được căn chỉnh đến 8 byte. Tuy nhiên, bộ cấp phát bộ nhớ của tôi chỉ liên kết với các ranh giới 8 byte theo mặc định, vì vậy bây giờ mã trong IBase::operator new
trả về một phần bộ nhớ không sử dụng được. Làm thế nào điều này nghĩa vụ phải được giải quyết một cách chính xác?
Tôi chỉ có thể buộc tất cả phân bổ đến 16 byte, sẽ hoạt động tốt cho đến khi loại căn chỉnh 32 byte bật lên. Tìm ra sự liên kết bên trong operator new
dường như không tầm thường (tôi có thể thực hiện một cuộc gọi hàm ảo ở đó để có được sự liên kết thực tế không?) Cách được đề nghị để xử lý điều này là gì?
Tôi biết malloc
có nghĩa vụ trả lại một phần bộ nhớ phù hợp cho mọi thứ, không may, "mọi thứ" này không bao gồm các loại SSE và tôi thực sự muốn làm việc này mà không yêu cầu người dùng nhớ loại nào có liên kết.
Có lẽ bạn có thể sử dụng IBase (IBase16?) Khác cho một số đối tượng có yêu cầu căn chỉnh đặc biệt. –
Bạn thậm chí có thể làm cho lớp cơ sở này (IBase16, IBase32) templated, vì vậy bạn có thể sử dụng IBase. –
Patrick
Bạn có thể căn chỉnh trên ranh giới 64 byte. :) – Bill