Este ejemplo:Cómo comparar objetos de tipo POD
#include <iostream>
#include <cstring>
struct A
{
int a;
bool b;
};
bool foo(const A a1, const A a2)
{
return (0 == std::memcmp(&a1, &a2, sizeof(A)));
}
int main()
{
A a1 = A();
a1.a = 5;a1.b = true;
A a2 = A();
a2.a = 5;a2.b = true;
std::cout<<std::boolalpha << foo(a1, a2) << std::endl;
}
va a producir false
, a causa de relleno.
No tengo acceso a la función foo
, y no puedo cambiar la forma en que se realiza la comparación.
Suponiendo una bool
ocupa 1 byte (eso es cierto en mi sistema), si cambio el struct A
a esto:
struct A
{
int a;
bool b;
char dummy[3];
};
entonces funciona bien en mi sistema (la salida es true
).
¿Hay algo más que pueda hacer para solucionar el problema anterior (obtenga la salida true
)?
¿Por qué estás pasando por 'const' value y no por' const & '? ==> 'foo (const A a1, const A a2);' – iammilind
@iammilind La función 'foo' es de una biblioteca de terceros, y no tengo acceso para cambiar su firma –
¿Ha intentado empaquetar la estructura desde que parece tener control sobre eso? De esta forma, es posible que no tengas que usar el "truco" del memset. VS: '#pragma pack (1)' justo antes de la estructura. G ++ mismo. http://msdn.microsoft.com/en-us/library/2e70t5y1%28v=vs.80%29.aspx http://gcc.gnu.org/onlinedocs/gcc/Structure_002dPacking-Pragmas.html – RedX