2017-09-08 18 views
11

Chuyên môn của std::vector<bool>, như được chỉ rõ trong C++ 11 23.3.7/1, không khai báo thành viên dữ liệu (ví dụ: được đề cập herehere).Tại sao std :: vector <bool> không có .data()?

Câu hỏi đặt ra là: Tại sao std :: vector không có .data()? Đây là câu hỏi rất giống như tại sao một vectơ của bools không được lưu trữ liên tục trong bộ nhớ. Những lợi ích khi không làm như vậy là gì?

Tại sao con trỏ vào một mảng các bool không được trả lại?

+2

'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

+3

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

+3

'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

Trả lời

23

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:

enter image description here

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];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?

std::vector<bool>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.

+1

BTW, việc triển khai chính xác có thể không có chuyên môn hóa đó và không làm tối ưu hóa bộ nhớ. do đó, 'dữ liệu()' sẽ phải sao chép vào kiểu trả về dự kiến ​​tùy thuộc vào việc thực hiện. (hoặc tiêu chuẩn nên buộc tối ưu hóa thay vì chỉ cho phép nó). – Jarod42

+2

"8 lần ít hơn" là không * nhất thiết * đúng và phá hỏng câu trả lời này mà nếu không có pretentions của canonicity. Sửa đổi thành 'CHAR_BIT' hoặc tương tự? – Bathsheba

+1

@gsamaras: Tôi sẽ upvote một lần nữa nếu tôi có thể. – Bathsheba

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