数据结构对齐

title: 定义.
content: 内存地址"a"被称为"n字节对齐",当"a"是"n"的倍数("n"应是2的幂)。  一次内存访问被称为对齐的,当被访问的数据长度为"n" 字节且该数据地址为"n"字节对齐。如果内存未对齐,称作"misaligned"。显然,字节访问总是对齐的。  内存指针是对齐的,如果它所指的数据是对齐的。指向聚合数据(aggregate data,如struct或数组)是对齐的,当且仅当它的每个组成数据是对齐的。
title: 体系结构.
title: RISC.
content: Most RISC processors will generate an alignment fault when a load or store instruction accesses a misaligned address. This allows the operating system to emulate the misaligned access using other instructions. For example, the alignment fault handler might use byte loads or stores (which are always aligned) to emulate a larger load or store instruction.  Some architectures like MIPS have special unaligned load and store instructions. One unaligned load instruction gets the bytes from the memory word with the lowest byte address and another gets the bytes from the memory word with the highest byte address. Similarly, store-high and store-low instructions store the appropriate bytes in the higher and lower memory words respectively.  The Alpha architecture has a two-step approach to unaligned loads and stores. The first step is to load the upper and lower memory words into separate registers. The second step is to extract or modify the memory words using special low/high instructions similar to the MIPS instructions. An unaligned store is completed by storing the modified memory words back to memory. The reason for this complexity is that the original Alpha architecture could only read or write 32-bit or 64-bit values. This proved to be a severe limitation that often led to code bloat and poor performance. To address this limitation, an extension called the "Byte Word Extensions" (BWX) was added to the original architecture. It consisted of instructions for byte and word loads and stores.  Because these instructions are larger and slower than the normal memory load and store instructions, they should only be used when necessary. Some C and C++ compilers have an “unaligned” attribute that can be applied to pointers that need the unaligned instructions.
title: x86.
content: x86体系架构最初是不要求内存对齐。一些SSE2指令要求数据是128比特(16字节)对齐。有些CPU指令用于未对齐访问如MOVDQU。读写内存操作仅在对齐时才是原子的。
title: C语言struct在x86上的对齐.
content: C语言数据结构内的成员先后顺序不能改变。  常见的C语言编译器在32比特x86上,double是8字节对齐,但Linux上是4字节对齐(编译选项"-malign-double"实现8字节对齐)。 一些编译器(Microsoft, Borland, GNU,等等)使用 directive指定对齐的包入(packing)。例如:  这个结构在32位系统的大小为6字节。
title: 缺省packing与.
content: Microsoft编译器的项目缺省packing(编译选项/Zp)与指令。指令仅能减少packing尺寸。

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

Zarovnání paměti: Zarovnání paměti je způsob uspořádání a zpřístupnění dat v paměti počítače. V této souvislosti se používají dva příbuzné pojmy: "zarovnání dat" a "data structure padding". Data structure padding by se do češtiny dalo přeložit jako vkládání vaty (vycpávky či výplně). Když moderní počítače zapisují nebo čtou data z RAM, pracují s blokem dat o konstantní velikosti (například u 32-bitových operačních systémů se jedná o blok dat s velikostí 4 bajty). Tento blok dat se označuje pojmem slovo (používá se i anglický výraz ""). Zarovnání dat znamená umístit data o velikosti slova v paměti na takovou pozici, která je rovna násobku velikosti slova. To zlepšuje výkon celého systému vzhledem ke způsobu, jakým procesor pracuje s pamětí. Pro správné zarovnání dat může být nezbytné vložit za data, která netvoří svojí délkou úplný blok, nějaké nevýznamné bajty. Tomu se právě říká data structure padding – „vyplnit to vatou“.