Bu örnek nesneleri karşılaştırmak için: POD türleri
#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;
}
çünkü dolgu,
false
üretmek için gidiyor.
foo
işlevine erişimim yok ve karşılaştırmanın yapılma şeklini değiştiremiyorum.
struct A
{
int a;
bool b;
char dummy[3];
};
sonra benim sistemde çalışıyor (çıkış true
ise):
bir bool
1 byte (bu benim sistemde doğrudur) Ben buna struct A
değiştirirseniz, kaplar varsayarsak.
Yukarıdaki sorunu gidermek için yapabileceğim başka bir şey var mı (true
çıktısını alın)?
Niçin 'const' değerine göre değil, 'const &'? ==> 'foo (const A a1, const A a2);' – iammilind
@iammilind 'foo' işlevi bir 3. parti kitaplığından geliyor ve imzasını değiştirmek için erişimim yok –
Yapısından beri yapıyı paketlemeyi denediniz mi? üzerinde kontrol sahibi gibi görünüyor? Bu şekilde memset "trick" kullanmak zorunda olmayabilirsiniz. VS: '#pragma pack (1)' yapısından hemen önce. G ++ aynı. http://msdn.microsoft.com/en-us/library/2e70t5y1%28v=vs.80%29.aspx http://gcc.gnu.org/onlinedocs/gcc/Structure_002dPacking-Pragmas.html – RedX