【问题标题】:Struct member initialisation结构成员初始化
【发布时间】:2011-04-06 09:02:06
【问题描述】:

在阅读 DirectWrite 源代码时,我发现了以下结构:

/// <summary>
/// Line breakpoint characteristics of a character.
/// </summary>
struct DWRITE_LINE_BREAKPOINT
{
    /// <summary>
    /// Breaking condition before the character.
    /// </summary>
    UINT8 breakConditionBefore  : 2;

    /// <summary>
    /// Breaking condition after the character.
    /// </summary>
    UINT8 breakConditionAfter   : 2;

    /// <summary>
    /// The character is some form of whitespace, which may be meaningful
    /// for justification.
    /// </summary>
    UINT8 isWhitespace          : 1;

    /// <summary>
    /// The character is a soft hyphen, often used to indicate hyphenation
    /// points inside words.
    /// </summary>
    UINT8 isSoftHyphen          : 1;

    UINT8 padding               : 2;
};

注意每个成员声明后奇怪的“:”。我将假设它是成员变量的默认初始化值。

我尝试在 Google 上搜索以确认,但由于不知道它的确切名称,我没有走多远(大多数结果与默认初始化有关)。

这种技术叫什么名字?

【问题讨论】:

  • 它们只是“奇怪”的,因为你不知道它们是什么。 :)

标签: c++ struct


【解决方案1】:

注意每个之后的奇怪的“:” 成员声明。我要去 假设这是默认初始化 成员变量的值。

这不是默认初始化。这意味着breakConditionBefore 只是2 位整数,isWhitespace1 位整数。等等。

DWRITE_LINE_BREAKPOINT 中,一个 8 位整数(即 UINT8)分为 5 个成员,其中 3 个为 2 位整数,2 个成员为 1 位整数。

了解Bit-fields

【讨论】:

    【解决方案2】:

    不,它不是默认的初始化列表,而是位字段。请参考http://en.wikipedia.org/wiki/Bit_field

    【讨论】:

      【解决方案3】:

      :2 声明了 2 位的成员。这称为位域。由于声明的总位数加起来为 8,因此所有位域成员都是相邻的,并且它们的类型为 UINT8struct DWRITE_LINE_BREAKPOINT 的大小为单个字节。

      【讨论】:

        【解决方案4】:

        嗯,它们是位字段。

        标准文档本身为您提供了一个示例。

        来自1.7.5 C++ 内存模型

        [ 示例:声明为的结构

        struct {
        char a;
        int b:5,
        c:11,
        :0,
        d:8;
        struct {int ee:8;} e;`
        }
        

        包含四个独立的内存位置:字段a和位字段de.ee都是独立的内存位置, 并且可以同时修改,互不干扰。位域bc 一起构成 第四个内存位置。位域bc 不能同时修改,但例如ba 可以。 —结束示例]

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-02-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-12-17
          相关资源
          最近更新 更多