¿Por qué std :: vector no tiene .data ()?

La especialización de std::vector , como se especifica en C ++ 11 23.3.7 / 1, no declara un miembro de datos (por ejemplo, se menciona aquí y aquí ).

La pregunta es: ¿Por qué un std :: vector no tiene .data ()? Esta es la misma pregunta, ¿por qué un vector de bools no se almacena de forma contigua en la memoria? ¿Cuáles son los beneficios de no hacerlo?

¿Por qué no se puede devolver un puntero a una matriz de bools?

¿Por qué un std :: vector no tiene .data ()?

Porque un std::vector almacena múltiples valores en 1 byte.

Piense en ello como un sistema de almacenamiento comprimido, donde cada valor booleano necesita 1 bit. Entonces, en lugar de tener un elemento por bloque de memoria (un elemento por celda de matriz), el diseño de la memoria puede verse así:

introduzca la descripción de la imagen aquí

Suponiendo que desea indexar un bloque para obtener un valor, ¿cómo usaría el operador [] ? No puede devolver bool& (ya que devolverá un byte, que almacena más de un bools ), por lo que no podría asignarle un bool* . En otras palabras, bool *bool_ptr =&v[0]; no es un código válido y daría como resultado un error de comstackción.

Además, una implementación correcta podría no tener esa especialización y no realizar la optimización de la memoria (compresión). Por lo tanto, los data() tendrían que copiarse al tipo de retorno esperado dependiendo de la implementación (o el estándar debería forzar la optimización en lugar de solo permitirlo).

¿Por qué no se puede devolver un puntero a una matriz de bools?

Debido a que std::vector no se almacena como una matriz de bools, por lo tanto, no se puede devolver un puntero de manera directa. Podría hacerlo copiando los datos a una matriz y devolver esa matriz, pero es una opción de diseño no hacerlo (si lo hicieran, creo que esto funciona como los data() para todos los contenedores, lo que sería engañoso) .

¿Cuáles son los beneficios de no hacerlo?

Optimización de la memoria.

Por lo general, 8 veces menos uso de memoria, ya que almacena múltiples bits en un solo byte. Para ser exactos, CHAR_BIT veces menos.