定义结构使用的是 STRUCT 和 ENDS 伪指令。在结构内,定义字段的语法与一般的变量定义是相同的。结构对其包含字段的数量几乎没有任何限制:
字段初始值若结构字段有初始值,那么在创建结构变量时就要进行赋值。字段初始值可以使用各种类型:
下面的 Employee 结构描述了雇员信息,其包含字段有 ID 号、姓氏、服务年限,以及薪酬历史信息数组。结构定义如下所示,定义必须在声明 Employee 变量之前:
Employee STRUCT
IdNum BYTE "000000000"
LastName BYTE 30 DUP(0)
Years WORD 0
SalaryHistory DWORD 0,0,0,0
Employee ENDS
该结构内存保存形式的线性表示如下:
为了获得最好的内存 I/O 性能,结构成员应按其数据类型进行地址对齐。否则,CPU 将会花更多时间访问成员。例如,一个双字成员应对齐到双字边界。下表列岀了 Microsoft C 和 C++ 编译器,以及 Win32 API 函数的对齐方式。汇编语言中的 ALIGN 伪指令会使其后的字段或变量按地址对齐:
成员类型 | 对齐方式 | 成员类型 | 对齐方式 |
---|---|---|---|
BYTE, SBYTE | 对齐到 8 位(字节)边界 | REAL4 | 对齐到 32 位(双字)边界 |
WORD, SWORD | 对齐到 16 位(字)边界 | REAL8 | 对齐到 64 位(四字)边界 |
DWORD, SDWORD | 对齐到 32 位(双字)边界 | structure | 所有成员的最大对齐要求 |
QWORD | 对齐到 64 位(四字)边界 | union | 第一个成员的对齐要求 |
比如,下面的例子就把 myVar 对齐到双字边界:
现在正确地定义 Employee 结构,利用 ALIGN 将 Years 按字(WORD)边界对齐,SalaryHistory 按双字(DWORD)边界对齐。注释为字段大小:
Employee STRUCT
IdNum BYTE "000000000" ; 9
LastName BYTE 30 DUP(0) ; 30
ALIGN WORD ; 加 1 字节
Years WORD 0 ; 2
ALIGN DWORD ; 加 2 字节
SalaryHistory DWORD 0,0,0,0 ; 16
Employee ENDS ;共 60 字节