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

标签: c++ c


【解决方案1】:

可能涉及填充。 memcmp 只会比较 sizeof(s) 字节,仅此而已。如果涉及填充,结果将不会像您预期的那样,因为结构的未命名成员将处于不确定阶段。比较不会产生相同的结果。您可以使用 sizeof(structure type) 对结构实例进行 memset,这将在这种情况下产生正确的结果。

在这种情况下,您可以完美地做的事情是只比较该位域而不是整个结构实例。

【讨论】:

    猜你喜欢
    • 2017-06-20
    • 2018-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多