计算机科学

首页 > 计算机科学

数据结构对齐

2018-08-30 10:04:16     所属分类:编译原理

数据结构对齐是代码编译后在内存的布局与使用方式。包括三方面内容:数据对齐数据结构填充(padding)与包入(packing)。

现代计算机一般是32比特或64比特地址对齐,如果要访问的变量没有对齐,可能会触发总线错误。

当数据小于计算机的字(word)尺寸,可能把几个数据元素放在一个字中,称为包入(packing)。

许多编程语言自动处理数据结构对齐。Ada语言,[1][2] PL/I,[3] Pascal,[4] 某些C语言与C++实现, D语言,[5] Rust,[6] 与汇编语言允许特别控制对齐的方式。

目录

  • 1 定义
  • 2 体系结构
    • 2.1 RISC
    • 2.2 x86
  • 3 C语言struct在x86上的对齐
    • 3.1 缺省packing与#pragma pack
  • 4 参见
  • 5 参考文献
  • 6 外部链接

定义

内存地址a被称为n字节对齐,当an的倍数(n应是2的幂)。

一次内存访问被称为对齐的,当被访问的数据长度为n 字节且该数据地址为n字节对齐。如果内存未对齐,称作misaligned。显然,字节访问总是对齐的。

内存指针是对齐的,如果它所指的数据是对齐的。指向聚合数据(aggregate data,如struct或数组)是对齐的,当且仅当它的每个组成数据是对齐的。

体系结构

RISC

x86

x86体系架构最初是不要求内存对齐。一些SSE2指令要求数据是128比特(16字节)对齐。有些CPU指令用于未对齐访问如MOVDQU。读写内存操作仅在对齐时才是原子的。

C语言struct在x86上的对齐

C语言数据结构内的成员先后顺序不能改变。

常见的C语言编译器在32比特x86上,double是8字节对齐,但Linux上是4字节对齐(编译选项-malign-double实现8字节对齐)。

一些编译器(Microsoft,[7] Borland, GNU,[8]等等)使用#pragma directive指定对齐的包入(packing)。例如:

#pragma pack(push)  /* push current alignment to stack */
#pragma pack(1)     /* set alignment to 1 byte boundary */

struct MyPackedData
{
    char Data1;
    long Data2;
    char Data3;
};

#pragma pack(pop)   /* restore original alignment from stack */

这个结构在32位系统的大小为6字节。

缺省packing与#pragma pack

Microsoft编译器的项目缺省packing(编译选项/Zp)与#pragma pack指令。#pragma pack指令仅能减少packing尺寸。[9]

参见

  • 数组步长
  • 类型双关
  • offsetof

参考文献

  1. ^ Ada Representation Clauses and Pragmas. GNAT Reference Manual 7.4.0w documentation. [2015-08-30]. 
  2. ^ F.8 Representation Clauses. SPARCompiler Ada Programmer's Guide (PDF). [2015-08-30]. 
  3. ^ IBM System/360 Operating System PL/I Language Specifications (PDF). IBM. July 1966: 55–56. C28-6571-3. 
  4. ^ Niklaus Wirth. The Programming Language Pascal (Revised Report) (PDF): 12. July 1973. 
  5. ^ Attributes - D Programming Language: Align Attribute. [2012-04-13]. 
  6. ^ The Rustonomicon - Alternative Representations. [2016-06-19]. 
  7. ^ pack
  8. ^ 6.58.8 Structure-Packing Pragmas
  9. ^ Working with Packing Structures. MSDN Library. Microsoft. 2007-07-09 [2011-01-11]. 
  • Bryant, Randal E.; David, O'Hallaron. Computer Systems: A Programmer's Perspective 2003. Upper Saddle River, NJ: Pearson Education. 2003. ISBN 0-13-034074-X 

外部链接

  • IBM developerWorks article on data alignment
  • Article on data alignment and performance
  • MSDN article on data alignment
  • Article on data alignment and data portability
  • Byte Alignment and Ordering
  • Intel Itanium Architecture Software Developer's Manual
  • Data Alignment when Migrating to 64-Bit Intel® Architecture
  • PowerPC Microprocessor Family: The Programming Environments for 32-Bit Microprocessors

上一篇:名字修饰
下一篇:三地址码
相关推荐