Tại sao std :: vector không có .data()?
Vì một số std::vector<bool>
lưu nhiều giá trị trong 1 byte.
Hãy nghĩ về nó như hệ thống lưu trữ nén, trong đó mỗi giá trị boolean cần 1 bit. Vì vậy, thay vì có một yếu tố cho mỗi khối bộ nhớ (một yếu tố mỗi tế bào mảng), cách bố trí bộ nhớ có thể trông như thế này:
Giả sử bạn muốn đánh chỉ mục một khối để có được một giá trị, sẽ như thế nào bạn sử dụng toán tử []
? Nó không thể trả lại bool&
(vì nó sẽ trả về một byte, lưu trữ nhiều hơn một byte bools
), do đó bạn không thể gán một số bool*
cho nó. Nói cách khác, bool *bool_ptr =&v[0];
là không phải mã hợp lệ và sẽ dẫn đến lỗi biên dịch.
Hơn nữa, triển khai chính xác có thể không có chuyên môn hóa đó và không thực hiện tối ưu hóa bộ nhớ (nén). Vì vậy, data()
sẽ phải sao chép vào kiểu trả về dự kiến tùy thuộc vào việc triển khai (hoặc tiêu chuẩn sẽ buộc tối ưu hóa thay vì chỉ cho phép nó).
Tại sao con trỏ vào một mảng các bool không được trả lại?
Vì std::vector<bool>
là không lưu trữ như một mảng của bools, do đó không có con trỏ có thể được trả lại theo một cách đơn giản. Nó có thể làm điều đó bằng cách sao chép dữ liệu vào một mảng và trả về mảng đó, nhưng đó là một lựa chọn thiết kế để không làm điều đó (nếu có, tôi nghĩ rằng nó hoạt động như là data()
cho tất cả các vùng chứa, điều này sẽ gây hiểu lầm).
Lợi ích khi không làm như vậy là gì?
Tối ưu hóa bộ nhớ.
Thông thường ít hơn 8 lần sử dụng bộ nhớ, vì nó lưu trữ nhiều bit trong một byte đơn. Để chính xác, CHAR_BIT
lần ít hơn.
'vector' cho phép tối ưu hóa không gian bằng cách đóng gói nhiều bool trong một byte. 'data()' sẽ loại bỏ lợi ích đó. –
Jarod42
Lợi ích là bạn sử dụng bộ nhớ ít hơn 8 lần. Nhược điểm là bạn rối tung với mong đợi của mọi người. Nó đã được nhiều hơn hoặc ít hơn đã được kết luận rằng nhược điểm outweighs lợi ích. – nwp
'std :: vector' hơi giống như mời mẹ chồng bạn sống với bạn.Nó có thể có vẻ như là một ý tưởng tốt vào thời điểm đó, nhưng cuối cùng bạn sẽ hối tiếc toàn bộ ý tưởng. May mắn thay, tôi chỉ có thể tự tin vào một trong những sự vi phạm này. –
Bathsheba