¿Cuál es el propósito de std::byte?

4 minutos de lectura

Ahora que c++17 tiene std::byteestaba buscando una manera de convertir código que lee archivos a char en código que lee archivos en byte. Un archivo contiene bytes, no un montón de enteros.

Luego leí esta pregunta y esta otra pregunta donde la gente argumentaba que leer archivos en byte está mal, y que leer archivos en char es correcto.

Si byte no está diseñado con el propósito de acceder a la memoria y, por analogía, a los archivos, entonces, ¿cuál es su propósito? Como se cita en las otras dos preguntas:

Al igual que char y char sin firmar, se puede usar para acceder a la memoria sin formato ocupada por otros objetos (representación de objetos), pero a diferencia de esos tipos, no es un tipo de carácter ni un tipo aritmético. Un byte es solo una colección de bits, y solo se definen operadores lógicos bit a bit para él.

Esto suena como el tipo exacto que debería usarse para leer archivos, no caracteres.

  • Considéralo un tipo de vocabulario. Si pretende manipular el bytes de tu objeto, que es más expresivo, un unsigned char* o un std::byte*?

    – StoryTeller – Unslander Mónica

    24 de noviembre de 2017 a las 23:39

  • Para ser honesto, tampoco veo su propósito. Las operaciones permitidas en él parecen arbitrarias. ¿Cuál es la diferencia entre la manipulación de bits y, por ejemplo, la suma? ¿Por qué uno está permitido, mientras que el otro está prohibido? Pero estoy de acuerdo con StoryTeller, std::byte es un nombre más expresivo cuando solo desea almacenar/leer/escribir algunos bytes. No creo que lo use nunca (excepto si alguien pudiera darnos una respuesta esclarecedora), como unsigned char esta bien para mi

    – geza

    25 de noviembre de 2017 a las 1:57


  • @geza: bueno, en teoría, cosas como la suma asignan significados a los bits individuales, mientras que las manipulaciones de bits no lo hacen. Si su byte representa un número (si no, ¿por qué usaría la suma), use un tipo integral. En la práctica, eso rompe algunos trucos como i & (i-1) que también solo quieren realizar operaciones de bits.

    – Mike MB

    25 de noviembre de 2017 a las 11:27


  • @MikeMB: ¡buen ejemplo! Esa es otra razón por la que no usaré std::byte. (se podría argumentar que debería haber un clearLowestBit(std::byte) función para esto, sin embargo, que se convierte internamente, pero realmente no veo el beneficio de prohibir las operaciones habituales en un byte, como la adición)

    – geza

    25 de noviembre de 2017 a las 11:39


  • @MikeMB: … Hay muchos trucos en los que se necesitan operaciones numéricas. No puedes cubrirlos a todos con std funciones

    – geza

    25 de noviembre de 2017 a las 12:35

Quizás estés malinterpretando las cosas.

byte está muy destinado a “acceder a la memoria”. Está destinado a usar el tipo cuando el almacenamiento es solo una secuencia de bytes en lugar de una matriz de caracteres.

Los tipos de Iostream no se pueden especializar con byte, ya que están diseñados en torno a personajes como interfaz. Es decir, no piensan en los archivos como secuencias de bytes; piensan en ellos como secuencias de caracteres. Ahora, ciertamente puede leer directamente en un byte matriz mediante el uso de un molde o dos. Pero esa no es la forma en que iostream piensa de forma nativa.

Tienes que hacer una distinción entre la forma en que funciona iostream y la forma archivos trabajar. Iostream es solo una biblioteca de archivos IO, después de todo; difícilmente es el final de todas las API de archivos.

La mayoría de las API de archivos para leer datos binarios toman void* en lugar de matrices de caracteres. std::fread/fwriteEtcétera.

Es decir, debe pensar en esto, no como un problema con std::bytepero como un problema con iostream. Sólo otro en una larga lista de ellos.

  • Iostreams ataca de nuevo, solo deja de usarlo

    – Lectem

    25 de noviembre de 2017 a las 12:30

  • Por lo que puedo decir, iostream (std::fstream) es la única forma multiplataforma de trabajar con nombres de archivo Unicode, utilizando el std::filesystem::path sobrecarga. ¿Existen planes para agregar una sobrecarga similar a std::fopen o para proporcionar una forma diferente de leer datos binarios de archivos?

    – Nicolás

    8 de marzo de 2019 a las 14:47

  • @Nikolai: El comité no está dispuesto a realizar modificaciones en las API de la biblioteca estándar C. Pero la API de ifstream es perfectamente útil para leer datos binarios.

    – Nicolás Bolas

    8 de marzo de 2019 a las 14:49

  • @Nicol Bolas: este comentario sugiere que los iostreams no son adecuados para el acceso sin formato a los archivos, ¿es incorrecto? ¿Quizás podría aclarar cuál es exactamente la diferencia entre un byte y un carácter?

    – Nicolás

    8 de marzo de 2019 a las 15:24

¿Ha sido útil esta solución?