c++ - assignment - ¿Se copian los bytes de relleno de un tipo de POD?
copy constructor struct c++ (4)
El constructor de copiar / mover implícitamente definido para una clase X no sindicalizada realiza una copia / movimiento de sus bases y miembros para miembros.
12.8 / 15 [class.copy] en N4141
El patrón de bits en los bytes de relleno se permite por lo tanto diferir.
Supongamos que tengo un tipo de POD como este:
struct A {
char a;
int b;
};
En mi sistema, sizeof(A) == 8
, aunque sizeof(char) == 1
y sizeof(b) == 4
. Esto significa que la estructura de datos tiene 3 bytes no utilizados.
Ahora supongamos que lo hacemos
A x = ...;
A y =x;
Pregunta:
¿Se garantiza que los 8 bytes de y
serán idénticos, incluso los 3 que no se usaron?
De forma equivalente, si transfiero los bytes subyacentes de algunos objetos A
a otro programa que no comprende su significado o estructura, y los trata como una matriz de 8 bytes, ¿puede ese otro programa comparar de forma segura dos A
para la igualdad?
Nota: En un experimento con gcc 7 , parece que esos bytes sí se copian. Me gustaría saber si esto está garantizado.
No es autoritativo, pero la entrada de std::memcmp
para std::memcmp
sugiere que los bytes de relleno pueden diferir:
memcmp()
entre dos objetos de tipostruct{char c; int n;}
struct{char c; int n;}
comparará los bytes de relleno cuyos valores pueden diferir cuando los valores dec
yn
son los mismos
Respondiendo a tu segunda pregunta:
De forma equivalente, si transfiero los bytes subyacentes de algunos objetos A a otro programa que no comprende su significado o estructura, y los trata como una matriz de 8 bytes, ¿puede ese otro programa comparar de forma segura dos As para la igualdad?
Como un objeto de su tipo puede contener bytes de relleno, otro programa generalmente no puede comparar dos de esos objetos para la igualdad:
Saber qué bits de los bytes que componen el objeto semánticamente es la clave para definir su representación de valores . Sin embargo, en este escenario, el programa objetivo solo conoce la representación del objeto , es decir, la secuencia de bytes que representa dicho objeto en la memoria, incluidos los bytes de relleno. Una función como memcmp solo puede comparar aquellos objetos cuya representación de valores es idéntica a su representación de objetos de una manera significativa. Si lo usa para comparar objetos en términos de valor aunque tengan relleno, puede no dar los resultados correctos ya que no puede decir qué bits en la representación del objeto son irrelevantes para que las representaciones de valores de dos objetos sean iguales.
dado que usted preguntó acerca de un tipo de POD (por lo tanto, incluidos los sindicatos), vale la pena mencionar que de acuerdo con [class.copy]
El constructor copiar / mover implícitamente definido para una unión X copia la representación del objeto (6.9) de X
que para los tipos trivially copyable debe incluir también los bits de relleno. Por lo tanto, podría ser solo una cuestión de reemplazar A con
union A{ struct {
char a;
int b;
}; };
(en realidad, lo anterior usa una estructura anónima no estándar, pero entiendes el punto ...)