Why does std::vector<bool> have no .data()?

人盡茶涼 提交于 2019-11-30 08:55:44

问题


The specialisation of std::vector<bool>, as specified in C++11 23.3.7/1, doesn't declare a data member (e.g. mentioned here and here).

The question is: Why does a std::vector have no .data()? This is the very same question as why is a vector of bools not stored contiguously in memory. What are the benefits in not doing so?

Why can a pointer to an array of bools not be returned?


回答1:


Why does a std::vector have no .data()?

Because an std::vector<bool> stores multiple values in 1 byte.

Think about it like a compressed storage system, where every boolean value needs 1 bit. So, instead of having one element per memory block (one element per array cell), the memory layout may look like this:

Assuming that you want to index a block to get a value, how would you use operator []? It can't return bool& (since it will return one byte, which stores more than one bools), thus you couldn't assign a bool* to it. In other words bool *bool_ptr =&v[0]; is not valid code, and would result in a compilation error.

Moreover, a correct implementation might not have that specialization and don't do the memory optimization (compression). So data() would have to copy to the expected return type depending of implementation (or standard should force optimization instead of just allowing it).

Why can a pointer to an array of bools not be returned?

Because std::vector<bool> is not stored as an array of bools, thus no pointer can be returned in a straightforward way. It could do that by copying the data to an array and return that array, but it's a design choice not to do that (if they did, I would think that this works as the data() for all containers, which would be misleading).

What are the benefits in not doing so?

Memory optimization.

Usually 8 times less memory usage, since it stores multiple bits in a single byte. To be exact, CHAR_BIT times less.



来源:https://stackoverflow.com/questions/46115669/why-does-stdvectorbool-have-no-data

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!