在阅读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以确认,但我不知道究竟是什么叫做我没有达到目标(大多数结果都与默认初始化有关)。
这项技术的名称是什么?
答案 0 :(得分:4)
注意每个之后的奇怪“:” 会员声明。我要去 假设它是默认初始化 成员变量的值。
这不是默认初始化。这意味着breakConditionBefore
只是2
位整数,isWhitespace
是1
位整数。等等。
在DWRITE_LINE_BREAKPOINT
中,一个8位整数(即UINT8)分为5个成员,其中3个是2位整数,2个成员是1位整数。
答案 1 :(得分:3)
不,它不是默认初始化列表而是位字段。请参阅http://en.wikipedia.org/wiki/Bit_field。
答案 2 :(得分:2)
:2
声明2位成员。这称为位域。由于声明的总位数加起来为8,所有位域成员都是相邻的,其类型为UINT8
,struct 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
和位字段d
和e.ee
均为单独的内存位置,
并且可以同时修改而不会相互干扰。位域b
和c
一起构成了
第四个内存位置。位字段b
和c
无法同时修改,但例如b
和a
可以。
- 例子]