C++ memcmp为相同(零值)位字段结构返回非零
比较值中均包含0的两个位字段struct时,我看到memcmp出现意外输出。memcmp正在输出中返回非零结果 这是否意味着位字段不会引用任何内容?如果是这样(导致memcmp不可靠),比较任何包含位字段的内容的最佳方法是什么?我可以使用位字段结构创建自己的类或类型C++ memcmp为相同(零值)位字段结构返回非零,c++,c,C++,C,比较值中均包含0的两个位字段struct时,我看到memcmp出现意外输出。memcmp正在输出中返回非零结果 这是否意味着位字段不会引用任何内容?如果是这样(导致memcmp不可靠),比较任何包含位字段的内容的最佳方法是什么?我可以使用位字段结构创建自己的类或类型 struct bitStruct{ int b:4; }; int test() { bitStruct s = {0}; bitStruct zero = {0}; cout << m
struct bitStruct{
int b:4;
};
int test()
{
bitStruct s = {0};
bitStruct zero = {0};
cout << memcmp(&s, &zero, sizeof(s)); // this memcmp returns non-zero.
return 0;
}
struct位结构{
int b:4;
};
int测试()
{
位结构s={0};
位结构零={0};
cout可能涉及填充。memcmp
只会比较sizeof(s)
bytes,仅此而已。如果涉及填充,结果将不会像您预期的那样,因为结构的未命名成员将处于不确定阶段。比较将不会产生相同的结果。您可以使用sizeof(结构类型)memset结构实例,这将在该场景中产生正确的结果
在这种情况下,您可以完美地只比较该位字段而不是整个结构实例。可能涉及填充。memcmp
只比较sizeof(s)
bytes,仅此而已。如果涉及填充,结果将不会像您预期的那样,因为结构的未命名成员将处于不确定阶段。比较将不会产生相同的结果。您可以使用sizeof(结构类型)memset结构实例,这将在该场景中产生正确的结果
这种情况下,您可以做的完美的事情是比较这个位字段,而不是整个结构实例。< /P>因为这是C++,您可以超载<代码> >=< /COD>操作符,并按字段比较结构字段,这也会更有效,当然可靠。比较<代码> S.B<代码>和<代码> 0 .b>代码>这是什么?C++没有改变MEMCMP的行为是否出乎意料,也假设我不能过载= =,或者你可以使用<代码> BITStULTS= { B=0 };< /Calp>初始化器和测试。它不应该有什么区别。我担心的是,它是位字段,编译器只保证第一个4位是零,其余的是不确定的。(在这种情况下,谁知道第4-31位是什么)和所有
32位中的memcmp
都会失败。@user888270:您甚至不需要位字段就可以出现这种问题。astruct{char a;int b;}
通常在a
和b
之间有三个字节的填充,并且所述字节的内容通常是未定义的(即使您先显式地将memset
设置为0,编译器有时也可能对a
进行四字节存储,假设它是无害的,如果它认为它更有效的话)因此,<>代码> > <代码> > <代码> b >代码>值不会总是返回0。<代码> MMECMP < /C>在填充时不是通用的。因为这是C++,您可以超载=运算符,并按字段比较结构字段,这也会更有效,当然也可以。比较一下:<代码> S.B< <代码>和<代码> 0 .b>代码>这是C++没有改变MEMCMP意外行为的事实,也假设我不能超载==,或者您可以使用<代码> BITStULTS= { .b=0 }吗?
初始化器和测试。这不应该有什么区别。我担心的是,编译器只保证前4位为零,其余的可能是不确定的,这是一个位字段。(在这种情况下,谁知道第4-31位是什么)所有32位中的memcmp
都会失败。@user888270:您甚至不需要位字段就有这种问题。struct{char a;int b;}
通常在a
和b
之间有三个字节的填充,并且所述字节的内容通常是未定义的(即使您先显式地将memset
设置为0,编译器有时也可能对a
执行四字节存储,假设它是无害的,如果它认为这样更有效),因此具有相同a
和b
值的两个此类结构的memcmp
不会总是返回0。memcmp
在涉及填充时不是通用的。