Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ memcmp为相同(零值)位字段结构返回非零_C++_C - Fatal编程技术网

C++ 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

比较值中均包含0的两个位字段struct时,我看到memcmp出现意外输出。memcmp正在输出中返回非零结果

这是否意味着位字段不会引用任何内容?如果是这样(导致memcmp不可靠),比较任何包含位字段的内容的最佳方法是什么?我可以使用位字段结构创建自己的类或类型

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:您甚至不需要位字段就可以出现这种问题。a
struct{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
在涉及填充时不是通用的。