【发布时间】:2018-02-07 02:34:09
【问题描述】:
比较两个位域结构时,我看到 memcmp 的意外输出,这两个位域的值都包含 0。 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;
}
【问题讨论】:
-
因为这是 c++,你可以重载
==运算符并逐个字段比较结构,这也会更有效,当然也更可靠。 -
比较
s.b和zero.b怎么样? -
这是 c++ 并没有改变 memcmp 行为异常的事实,并且还假设我不能重载 ==
-
或者你可以使用
bitStruct s = { .b = 0 };初始化器和测试。它不应该有所作为。我很担心,因为它是一个位域,编译器只保证前 4 位为零,其余的可能是不确定的。 (在那种情况下,谁知道第 4-31 位是什么)和所有32-bits中的memcmp将失败。 -
@user888270:你甚至不需要位域来解决这类问题。
struct { char a; int b; }通常在a和b之间有三个字节的填充,并且所述字节的内容通常是未定义的(即使您首先明确地将memset设置为0,编译器也可能对@987654332 执行四个字节存储@ 有时,假设它是无害的,如果它认为它更有效),所以memcmp两个具有相同a和b值的结构不会总是返回 0。memcmp在填充时不是通用目的参与。