【发布时间】:2011-09-25 18:47:35
【问题描述】:
这个例子:
#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
foo函数来自第三方库,我无权更改其签名 -
您是否尝试过打包结构,因为您似乎可以控制它?这样,您可能不必使用 memset “技巧”。 VS:
#pragma pack(1)就在结构之前。 G++ 一样。 msdn.microsoft.com/en-us/library/2e70t5y1%28v=vs.80%29.aspxgcc.gnu.org/onlinedocs/gcc/Structure_002dPacking-Pragmas.html -
@RedX 我没有,但我会尝试。感谢您的链接
标签: c++