यह उदाहरण के वस्तुओं की तुलना करने के लिए:पॉड प्रकार
#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
आउटपुट प्राप्त करें)?
आप 'const' मान से क्यों गुजर रहे हैं, न कि' const & '? ==> 'foo (const a a1, const a a2);' – iammilind
@iammilind 'foo' फ़ंक्शन किसी तृतीय पक्ष लाइब्रेरी से है, और मेरे पास इसके हस्ताक्षर को बदलने की पहुंच नहीं है –
क्या आपने संरचना को पैक करने का प्रयास किया है ऐसा लगता है कि इस पर नियंत्रण है? इस तरह आपको स्मृति "चाल" का उपयोग नहीं करना पड़ेगा। वीएस: '#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