【问题标题】:A question about class definition in C++ " : 1" [duplicate]关于 C++ 中类定义的问题“:1”[重复]
【发布时间】:2011-06-10 13:32:41
【问题描述】:

可能重复:
What does 'unsigned temp:3' means

我在阅读Clang的代码时遇到了问题。

class LangOptions {
public:
    unsigned Trigraphs         : 1;  // Trigraphs in source files.
    unsigned BCPLComment       : 1;  // BCPL-style '//' comments.
    ...
};

这是我第一次看到语法“:1”,“:1”代表什么?谢谢!

【问题讨论】:

  • 感谢提醒。实际上这是同一个问题:-)

标签: c++ clang


【解决方案1】:

这是一个bitfield,这意味着该值将只使用一位,而不是 32(或您平台上的任何sizeof(unsigned) * <bits-per-byte>)。

位域对于编写紧凑的二进制数据结构很有用,尽管它们会带来一些性能成本,因为编译器/CPU 无法更新单个位,但在读取/写入完整字节时需要执行 AND/OR 操作。

【讨论】:

  • 注意*8,一个字节可能超过8位!感谢您精确计算运行时成本 :) 如果我没记错的话,还可以保证在这些字段上执行算术模数(2 ^ nb 位)......但我可能弄错了。
  • @Matthieu:谢谢。我已经编辑以匹配。另外,如果将结果存储在所需的位数中,算术不会自动模2吗? (或者可能在有符号和无符号上略有不同)
  • 谢谢 Macke,这很有帮助!
【解决方案2】:

TrigraphsBCPLComment 仅使用 1 位来保存值。

例如,

struct S
{
   signed char type : 2;
   signed char num  : 4;
   signed char temp : 2;
};

仅使用 8 位内存。 struct S 可以使用单个字节或内存。 对于某些实现,sizeof(S) 为 1。 但是typetemp 等于0,1,2 或3。而num 是 仅等于 0,1,2,..., 15。

【讨论】:

    【解决方案3】:

    这些是位域。 “1”是以位为单位的宽度。

    请参阅C FAQ 了解说明。

    【讨论】:

    • 我本来想对你大发雷霆,因为你没有链接到 C++ 常见问题解答——但它没有位域条目。
    猜你喜欢
    • 2011-05-26
    • 1970-01-01
    • 2019-03-12
    • 2023-04-08
    • 1970-01-01
    • 2017-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多