2011-06-30 13 views
9

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)?

+0

Niçin 'const' değerine göre değil, 'const &'? ==> 'foo (const A a1, const A a2);' – iammilind

+0

@iammilind 'foo' işlevi bir 3. parti kitaplığından geliyor ve imzasını değiştirmek için erişimim yok –

+0

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

cevap

11

Yapıdaki dolgu nedeniyle birincisi çalışmıyor. Dolgu, her iki nesne için farklı bit desenlerine sahiptir. Kullanmadan önce nesnesindeki tüm bitleri ayarlamak için memset kullanırsanız

, o zaman çalışır:

A a1; 
std::memset(&a1, 0, sizeof(A)); 
a1.a = 5;a1.b = true; 

A a2; 
std::memset(&a2, 0, sizeof(A)); 
a2.a = 5;a2.b = true; 

Çevrimiçi demolar:


Ayrıca, POD'lar için operator<, operator== vb.

+0

'A a1 = A();' A a1; std :: memset (& a1, 0, sizeof (A)); '. POD için işleçler yazabilirim, ancak karşılaştırma yapmakta olan işleve erişemiyorum, bu yüzden std :: memcmp –

+1

@ VJo: NO ile takılıyorum. Aynı değil 'A a1 = A() ', yalnızca üyeliği başlatır, dolguyu değil. Yani, A a1 = A() ', A a1; memset (& a1.a, 0, sizeof (a1.a)); memset (& a1.b, 0, sizeof (a1.b)); '. Kalan '(sizeof (A) - sizeof (a1.a) - sizeof (a1.b))' byte, çöp içeren gibi kalır. – Nawaz

+0

Kesinlikle, 'A a1 = A() '***, doldurmayı başlatmak için *** garanti edilmez, ancak yine de yapabilir. – sharptooth