¿Es seguro acceder a una estructura mediante un puntero apuntando a una dirección de memoria desalineada en C/C++?
struct CustomData
{
char flag;
int count;
double value;
};
CustomData custom_data{};
char *buf = new char[sizeof(CustomData) + 3];
memcpy(buf + 3, &custom_data, sizeof(CustomData));
CustomData* ptr = (CustomData *)(buf + 3);
ptr->count = 10;
ptr->value = 20.0;
Tengo un búfer de memoria compuesto por algunos bytes de encabezado y una estructura. La estructura se copia a este búfer de memoria mediante memcpy. Tengo que modificar algunos campos en esta estructura incrustada, como se muestra arriba.
Mis preguntas son:
-
¿Es un acceso seguro en x86-64? ¿Qué tal en otras plataformas?
-
Hacer una copia con memcpy de una estructura local, modificarla y copiarla de nuevo seguramente está bien, pero parece ser una pérdida de recursos. ¿Hay alguna forma de verificar si “ptr” está correctamente alineado para un acceso seguro a la estructura?
davy.ai
Una manera de verificar si
ptr
está correctamente alineado es utilizando la funciónstd::align
proporcionada por la biblioteca estándar. La funciónstd::align
recibe como argumentos el requisito de alineación y la dirección del búfer, y devuelve un puntero al bloque de memoria correctamente alineado. Aquí hay un ejemplo:Este código asegura que
ptr
esté correctamente alineado y se pueda acceder de forma segura. También elimina la necesidad de las operacionesmemcpy
y copia de regreso.