2011-06-30 26 views
9

यह उदाहरण के वस्तुओं की तुलना करने के लिए:पॉड प्रकार

#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; 
} 

गद्दी की वजह से, false निर्माण करने के लिए जा रहा है।

मेरे पास foo फ़ंक्शन तक पहुंच नहीं है, और मैं तुलना करने के तरीके को बदल नहीं सकता हूं।

मान लिया जाये कि एक bool 1 बाइट (है कि मेरे सिस्टम पर सच है), अगर मैं बदलने पर भी यह करने के लिए struct A पर है:

struct A 
{ 
    int a; 
    bool b; 
    char dummy[3]; 
}; 

तो यह अपने सिस्टम पर ठीक काम करता है (उत्पादन true है)।

क्या उपरोक्त समस्या को ठीक करने के लिए मैं कुछ और कर सकता हूं (true आउटपुट प्राप्त करें)?

+0

आप 'const' मान से क्यों गुजर रहे हैं, न कि' const & '? ==> 'foo (const a a1, const a a2);' – iammilind

+0

@iammilind 'foo' फ़ंक्शन किसी तृतीय पक्ष लाइब्रेरी से है, और मेरे पास इसके हस्ताक्षर को बदलने की पहुंच नहीं है –

+0

क्या आपने संरचना को पैक करने का प्रयास किया है ऐसा लगता है कि इस पर नियंत्रण है? इस तरह आपको स्मृति "चाल" का उपयोग नहीं करना पड़ेगा। वीएस: '#pragma पैक (1)' संरचना से ठीक पहले। जी ++ वही। http://msdn.microsoft.com/en-us/library/2e70t5y1%28v=vs.80%29.aspx http://gcc.gnu.org/onlinedocs/gcc/Structure_002dPacking-Pragmas.html – RedX

उत्तर

11

पहला व्यक्ति संरचना में पैडिंग के कारण काम नहीं कर रहा है। पैडिंग में दोनों ऑब्जेक्ट्स के लिए अलग-अलग बिट पैटर्न हैं।

आप memset का उपयोग करते हैं यह प्रयोग करने से पहले वस्तु में सभी बिट्स स्थापित करने के लिए है, तो यह काम करेगा:

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; 

ऑनलाइन क़ौम:


वैसे, आप पीओडी के लिए operator<, operator== आदि लिख सकते हैं।

+0

'ए ए 1 = ए();' के लिए धन्यवाद 'ए' ए 1 के समान है; std :: memset (& a1, 0, sizeof (ए)); '। मैं पीओडी के लिए ऑपरेटर लिख सकता हूं, लेकिन मेरे पास तुलना करने वाले फ़ंक्शन तक पहुंच नहीं है, इसलिए मैं std :: memcmp –

+1

@VJo: NO के साथ फंस गया हूं। यह वही नहीं है 'ए 1 = ए()' केवल सदस्यों को शुरू करता है, न कि पैडिंग। यही है, 'ए 1 = ए() '' ए 1 के बराबर है; मेमसेट (& a1.a, 0, sizeof (a1.a)); मेमसेट (और ए 1 बी, 0, आकार (ए 1 बी)); '। शेष '(आकार (ए) - आकार (ए 1 एए) - आकार (ए 1 बी)) 'बाइट्स कचरा युक्त, इस तरह बनी हुई है। – Nawaz

+0

खैर, कड़ाई से कह रहा है, 'ए 1 = ए() '*** की गारंटी नहीं है *** पैडिंग शुरू करने के लिए, लेकिन यह अभी भी ऐसा कर सकता है। – sharptooth