【问题标题】:Simple C++ syntax question about colon关于冒号的简单 C++ 语法问题
【发布时间】:2010-02-10 16:34:55
【问题描述】:

我刚刚看到一段代码sn-p,里面有一段我以前从未见过的语法。 bool start : 1; 是什么意思?我在头文件的类定义中找到了它。

【问题讨论】:

    标签: c++ syntax


    【解决方案1】:
    struct record {
        char *name;
        int refcount : 4;
        unsigned dirty : 1;
    };
    

    那些是位域;该数字给出了字段的确切大小,以位为单位。 (有关详细信息,请参阅任何有关 C 的完整书籍。)位域可用于在具有多个二进制标志或其他小字段的结构中节省空间,并且它们还可用于尝试符合外部强加的存储布局。 (他们在后一项任务中的成功被一些机器从左到右分配而在其他机器上从右到左分配的事实减轻了)。

    请注意,用于指定字段大小(以位为单位)的冒号表示法仅在结构(和联合)中有效;您不能使用此机制来指定任意变量的大小。

    • 参考:K&R1 Sec. 6.7 pp. 136-8
    • K&R2 秒。 6.9 页 149-50
    • ISO 秒。 6.5.2.1
    • H&S 秒。 5.6.5 pp. 136-8

    【讨论】:

      【解决方案2】:

      这是一个位域。 : 1 表示使用一位。 参见例如http://msdn.microsoft.com/en-us/library/ewwyfdbe(VS.71).aspx

      【讨论】:

      • 网址似乎不再有效。
      【解决方案3】:

      这意味着 start 是 1 位宽,而普通的 bool 是 1 字节长。您可以将多个较小的变量打包成一个较大的变量,编译器将为您生成读/写所需的所有和/或代码。您会受到(明显的)性能影响,但如果使用得当,您将使用更少的内存。

      【讨论】:

      • 表现什么?我假设编译过程变慢了(这不应该是一个问题恕我直言),但运行时性能是否也会变慢?
      • 是的,在运行时,您对该变量的每次访问(读取或写入)都必须转换为位级访问。例如,如果您读取其中一个内容,您首先必须将大字段加载到寄存器中,并使用掩码将其加载,然后右移,这至少比正常读取慢 3 倍。写入也是如此。
      • 越界位字段的情况更糟,必须将它们组合起来,使工作量翻倍(如果它们不被完全忽略的话)。
      【解决方案4】:

      查看有关Bit Fields 的维基百科条目。它告诉编译器结构成员应该占用多少位。

      【讨论】:

        【解决方案5】:

        它将成员start 变成一个位域,保留1 位空间。

        仅对结构/类成员有效,不能有位域变量。

        【讨论】:

          【解决方案6】:

          这是bit fields的语法

          本质上,您将结构中的字段定义为只有几个位的完整字节或短字节或整数。
          几个位域可能共享同一个 int,因此这种方法可以作为一种巧妙的方法来避免在构造值时进行一些位操作。

          【讨论】:

            【解决方案7】:

            这是描述bit fields的语法。这是一种将更多信息打包到更少量存储中的方法。而通常一个 bool 至少需要一个字节(可能更多)来表示,通过使用位字段,您可以使用简单的语法将多个 bool 组合成一个字节。

            不过要小心。作为该语言鲜为人知的领域之一,您在使用它们时可能会遇到极端情况。例如,由此产生的数据结构可能无法在处理器类型之间移植。

            【讨论】:

              【解决方案8】:

              这是一个bit-field。但我从未尝试过在布尔值上创建位域。

              【讨论】:

                猜你喜欢
                • 2011-02-12
                • 2020-01-06
                • 1970-01-01
                • 1970-01-01
                • 2011-10-11
                • 1970-01-01
                • 2019-12-23
                • 2011-03-22
                • 1970-01-01
                相关资源
                最近更新 更多