2011-04-06 186 views
2

虽然通过我碰到下面的结构传来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; 
}; 

通知怪“:”每一个成员的声明之后。我将假设它是成员变量的默认初始化值。

我试着搜索谷歌来确认,但并不知道它的名字到底是什么,我没有得到太多的结果(大部分结果在默认初始化的情况下)。

这种技术的名称是什么?

+0

他们只是“奇怪”,因为你不知道他们是什么。 :) – 2011-04-06 09:39:44

回答

4

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

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

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

阅读Bit-fields

2

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

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可以是。 -End example]