结构成员初始化

时间:2011-04-06 09:02:06

标签: c++ struct

在阅读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以确认,但我不知道究竟是什么叫做我没有达到目标(大多数结果都与默认初始化有关)。

这项技术的名称是什么?

4 个答案:

答案 0 :(得分:4)

  

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

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

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

了解Bit-fields

答案 1 :(得分:3)

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

答案 2 :(得分:2)

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

答案 3 :(得分:1)

嗯,它们是比特字段。

标准文档本身就是一个例子。

来自 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可以。 - 例子]