Knowledge

Data structure alignment

Source đź“ť

2012:
segment can only be located at an address that is a multiple of 16, starting from address 0. Page, which means a segment can only be located at an address that is a multiple of 256, starting from address 0. Inpage, which means a segment can be located at whichever of the preceding attributes apply plus must be located so that it does not cross a page boundary The alignment codes are: B - byte W - word G - paragraph xR - inpage P - page A - absolute the x in the inpage alignment code can be any other alignment code. a segment can have the inpage attribute, meaning it must reside within a 256 byte page and can have the word attribute, meaning it must reside on an even numbered byte.
139: 542:
a minimal amount of padding is required. The minimal amount of padding required is always less than the largest alignment in the structure. Computing the maximum amount of padding required is more complicated, but is always less than the sum of the alignment requirements for all members minus twice the sum of the alignment requirements for the least aligned half of the structure members.
530:) normally allocates individual data items on aligned boundaries, data structures often have members with different alignment requirements. To maintain proper alignment the translator normally inserts additional unnamed data members so that each member is properly aligned. In addition, the data structure as a whole may be padded with a final unnamed member. This allows each member of an 77: 36: 1561:
access to pa=0x12345ABC. Here, the 20/12-bit split luckily matches the hexadecimal representation split at 5/3 digits. The hardware can implement this translation by simply combining the first 20 bits of the physical address (0x12345) and the last 12 bits of the virtual address (0xABC). This is also referred to as virtually indexed (ABC) physically tagged (12345).
1557:(4096 Bytes) page is not just an arbitrary 4 KiB chunk of data. Instead, it is usually a region of memory that's aligned on a 4 KiB boundary. This is because aligning a page on a page-sized boundary lets the hardware map a virtual address to a physical address by substituting the higher bits in the address, rather than doing complex arithmetic. 2011:
A segment can have one (and in the case of the inpage attribute, two) of five alignment attributes: Byte, which means a segment can be located at any address. Word, which means a segment can only be located at an address that is a multiple of two, starting from address 0H. Paragraph, which means a
541:
member is followed by a member with a larger alignment requirement or at the end of the structure. By changing the ordering of members in a structure, it is possible to change the amount of padding required to maintain alignment. For example, if members are sorted by descending alignment requirements
513:
When a single memory word is accessed the operation is atomic, i.e. the whole memory word is read or written at once and other devices must wait until the read or write operation completes before they can access it. This may not be true for unaligned accesses to multiple memory words, e.g. the first
557:
One use for such "packed" structures is to conserve memory. For example, a structure containing a single byte (such as a char) and a four-byte integer (such as uint32_t) would require three additional bytes of padding. A large array of such structures would use 37.5% less memory if they are packed,
545:
Although C and C++ do not allow the compiler to reorder structure members to save space, other languages might. It is also possible to tell most C and C++ compilers to "pack" the members of a structure to a certain level of alignment, e.g. "pack(2)" means align data members larger than a byte to a
1560:
Example: Assume that we have a TLB mapping of virtual address 0x2CFC7000 to physical address 0x12345000. (Note that both these addresses are aligned at 4 KiB boundaries.) Accessing data located at virtual address va=0x2CFC7ABC causes a TLB resolution of 0x2CFC7 to 0x12345 to issue a physical
504:
Some processor designs deliberately avoid introducing such complexity, and instead yield alternative behavior in the event of a misaligned memory access. For example, implementations of the ARM architecture prior to the ARMv6 ISA require mandatory aligned memory access for all multi-byte load and
492:
If the highest and lowest bytes in a datum are not within the same memory word, the computer must split the datum access into multiple memory accesses. This requires a lot of complex circuitry to generate the memory accesses and coordinate them. To handle the case where the memory words are in
505:
store instructions. Depending on which specific instruction was issued, the result of attempted misaligned access might be to round down the least significant bits of the offending address turning it into an aligned access (sometimes with additional caveats), or to throw an
514:
word might be read by one device, both words written by another device and then the second word read by the first device so that the value read is neither the original value nor the updated value. Although such failures are rare, they can be very difficult to identify.
1407:. If an array is partitioned for more than one thread to operate on, having the sub-array boundaries unaligned to cache lines could lead to performance degradation. Here is an example to allocate memory (double array of size 10) aligned to cache of 64 bytes. 701:
If the type "short" is stored in two bytes of memory then each member of the data structure depicted above would be 2-byte aligned. Data1 would be at offset 0, Data2 at offset 2, and Data3 at offset 4. The size of this structure would be 6 bytes.
705:
The type of each member of the structure usually has a default alignment, meaning that it will, unless otherwise requested by the programmer, be aligned on a pre-determined boundary. The following typical alignments are valid for compilers from
285:, which generally means that the data's memory address is a multiple of the data size. For instance, in a 32-bit architecture, the data may be aligned if the data is stored in four consecutive bytes and the first byte lies on a 4-byte boundary. 1130:
It is possible to change the alignment of structures to reduce the memory they require (or to conform to an existing format) by reordering structure members or changing the compiler's alignment (or “packing”) of structure members.
803:(ten bytes with C++Builder and DMC, eight bytes with Visual C++, twelve bytes with GCC) will be 8-byte aligned with C++Builder, 2-byte aligned with DMC, 8-byte aligned with Visual C++, and 4-byte aligned with GCC. 569:, it may also be used to format a data structure for transmission using a standard protocol. However, in this usage, care must also be taken to ensure that the values of the struct members are stored with the 509:
exception (if MMU hardware is present), or to silently yield other potentially unpredictable results. The ARMv6 and later architectures support unaligned access in many circumstances, but not necessarily all.
644:
padding = (align - (offset & (align - 1))) & (align - 1) = -offset & (align - 1) aligned = (offset + (align - 1)) & ~(align - 1) = (offset + (align - 1)) & -align
295:
between structure elements or after the last element of a structure. For example, on a 32-bit machine, a data structure containing a 16-bit value followed by a 32-bit value could have 16 bits of
1996: 1215:
structure to be aligned to a one byte boundary will cause the pre-processor to discard the pre-determined alignment of the structure members and thus no padding bytes would be inserted.
599:
For example, the padding to add to offset 0x59d for a 4-byte aligned structure is 3. The structure will then start at 0x5a0, which is a multiple of 4. However, when the alignment of
306:
Although data structure alignment is a fundamental issue for all modern computers, many computer languages and computer language implementations handle data alignment automatically.
2082: 1020:
The last member is padded with the number of bytes required so that the total size of the structure should be a multiple of the largest alignment of any structure member (
1391:, if the project packing is smaller than this. For this reason, setting the project packing to any value other than the default of 8 bytes would break the 1375:
On some Microsoft compilers, particularly for RISC processors, there is an unexpected relationship between project default packing (the /Zp directive) and the
655:
members are stored sequentially in memory so that, in the structure below, the member Data1 will always precede Data2; and Data2 will always precede Data3:
458:
Note that the definitions above assume that each primitive datum is a power of two bytes long. When this is not the case (as with 80-bit floating-point on
2075: 1567:
This is how a dynamic allocator that has no knowledge of alignment, can be used to provide aligned buffers, at the price of a factor two in space loss.
1387:
the packing size of a structure from the project default packing. This leads to interoperability problems with library headers which use, for example,
156: 49: 1697:
On modern computers where the target alignment is a power of two. This might not be true, for example, on a system using 9-bit bytes or 60-bit words.
1395:
directives used in library headers and result in binary incompatibilities between structures. This limitation is not present when compiling for x86.
1983: 2068: 1542:
Alignment concerns can affect areas much larger than a C structure when the purpose is the efficient mapping of that area through a hardware
566: 493:
different memory pages the processor must either verify that both pages are present before executing the instruction or be able to handle a
378:
is a power of 2). In this context, a byte is the smallest unit of memory access, i.e. each memory address specifies a different byte. An
596:
padding = (align - (offset mod align)) mod align aligned = offset + padding = offset + ((align - (offset mod align)) mod align)
489:
supported by the computer, aligned accesses will always access a single memory word. This may not be true for misaligned data accesses.
203: 175: 1972: 1718: 240: 222: 120: 63: 920:
After compilation the data structure will be supplemented with padding bytes to ensure a proper alignment for each of its members:
291:
is the aligning of elements according to their natural alignment. To ensure natural alignment, it may be necessary to insert some
182: 2244: 1768: 339: 160: 87: 2249: 847:(eight bytes with Visual C++, sixteen bytes with GCC) will be 8-byte aligned with Visual C++ and 16-byte aligned with GCC. 319: 189: 55: 2091: 1852: 494: 2039: 1877: 335: 299:
between the 16-bit value and the 32-bit value to align the 32-bit value on a 32-bit boundary. Alternatively, one can
171: 2196: 311: 585:
The following formulas provide the number of padding bytes required to align the start of a data structure (where
2191: 2160: 538: 346:
allow at least partial control of data structure padding, which may be useful in certain special circumstances.
1218:
While there is no standard way of defining the alignment of structure members (while C and C++ allow using the
331: 323: 102: 1911: 559: 303:
the structure, omitting the padding, which may lead to slower access, but uses three quarters as much memory.
735: 527: 149: 98: 2165: 1547: 1027:
In this case 3 bytes are added to the last member to pad the structure to the size of 12 bytes (
506: 1795: 2044: 1222:
specifier for this purpose it can be used only for specifying a stricter alignment), some compilers use
395: 196: 2175: 2140: 2123: 1900: 638: 531: 486: 281:
in modern computer hardware performs reads and writes to memory most efficiently when the data is
2218: 2206: 2113: 574: 558:
although accessing each structure might take longer. This compromise may be considered a form of
1564:
A block of data of size 2 - 1 always has one sub-block of size 2 aligned on 2 bytes.
2223: 1992: 1968: 1964: 343: 2201: 1743: 590: 259: 2034: 792:(eight bytes) will be 8-byte aligned on Windows and 4-byte aligned on Linux (8-byte with 781:(eight bytes) will be 8-byte aligned on Windows and 4-byte aligned on Linux (8-byte with 1923: 2211: 2155: 2128: 2029: 1208:
is no longer necessary as the structure is already aligned to the size of a long word.
652: 546:
two-byte boundary so that any padding members are at most one byte long. Likewise, in
462:) the context influences the conditions where the datum is considered aligned or not. 2238: 2145: 2060: 1954: 1832: 1791: 2135: 1928: 727: 723: 711: 451:. A memory pointer that refers to a data aggregate (a data structure or array) is 577:), which may be different from the endianness used natively by the host machine. 465:
Data structures can be stored in memory on the stack with a static size known as
2170: 2150: 2024: 634: 619: 482: 138: 485:
at a time. As long as the memory word size is at least as large as the largest
2118: 1404: 958:/* 1 byte for the following 'short' to be aligned on a 2 byte boundary 570: 498: 2055: 1985:
8086 Family Utilities - User's Guide for 8080/8085-Based Development Systems
1543: 1295: 707: 17: 1679:#define aligntonext(p, bits) alignto(((p) + (1 << bits) - 1), bits) 1294:
on a 32-bit system. The above directives are available in compilers from
719: 523: 1812: 1192:
The compiled size of the structure now matches the pre-compiled size of
565:
Although use of "packed" structures is most frequently used to conserve
1991:. Revision E (A620/5821 6K DD ed.). Santa Clara, California, USA: 1299: 1226:
directives to specify packing inside source files. Here is an example:
715: 307: 2049: 1572:// Example: get 4096 bytes aligned on a 4096 byte buffer with malloc() 1118: 1070: 961:
assuming that the address where structure begins is an even number */
428:-byte aligned. When a memory access is not aligned, it is said to be 410: 105:. Statements consisting only of original research should be removed. 455:
if (and only if) each primitive datum in the aggregate is aligned.
432:. Note that by definition byte memory accesses are always aligned. 327: 611:
will return zero, therefore the original value is left unchanged.
1676:#define alignto(p, bits) (((p) >> bits) << bits) 815: 547: 361: 315: 2064: 1777: 1554: 1303: 731: 459: 278: 132: 70: 29: 1123:, not 5 (not 8 either) (so that the size is a multiple of 2 ( 27:
Way in which data is arranged and accessed in computer memory
1770:
IBM System/360 Operating System PL/I Language Specifications
861:
Here is a structure with members of various types, totaling
1958: 2052:- discusses stack alignment for x86-64 calling conventions 1995:. May 1982 . pp. 1-6, 3-5. Order Number: 9800639-04. 1660:) works by adding an aligned increment, then clearing the 1009:/* 3 bytes to make total size of the structure 12 bytes */ 1017:
The compiled size of the structure is now 12 bytes.
637:) -- providing the offset is unsigned or the system uses 625:
The following formulas produce the correct values (where
618:
a power of two, the modulo operation can be reduced to a
810:(four bytes) will be 4-byte aligned. (e.g.: char*, int*) 501:
on any memory access during the instruction execution.
435:
A memory pointer that refers to primitive data that is
94: 1963:(2003 ed.). Upper Saddle River, New Jersey, USA: 1813:"Attributes - D Programming Language: Align Attribute" 1553:
For instance, on a 32-bit operating system, a 4 
1403:
It would be beneficial to allocate memory aligned to
858:
Some data types are dependent on the implementation.
2056:
The Lost Art of Structure Packing by Eric S. Raymond
818:
64-bit system when compared to a 32-bit system are:
554:
to eliminate all padding except around bit strings.
443:
if it is only allowed to contain addresses that are
262:. It consists of three separate but related issues: 2184: 2099: 163:. Unsourced material may be challenged and removed. 1853:"LayoutKind Enum (System.Runtime.InteropServices)" 1796:"The Programming Language Pascal (Revised Report)" 814:The only notable differences in alignment for an 1833:"The Rustonomicon - Alternative Representations" 1116:In this example the total size of the structure 1068:In this example the total size of the structure 1538:Hardware significance of alignment requirements 2040:Article on data alignment and data portability 1075:, not 5 (so that the size is a multiple of 4 ( 382:-byte aligned address would have a minimum of 2076: 2050:Stack Alignment in 64-bit Calling Conventions 1878:"The curious case of unaligned access on ARM" 1673:// Assume `uint32_t p, bits;` for readability 1290:This structure would have a compiled size of 1024:in this case, which = 4 on linux-32bit/gcc). 931:/* After compilation in 32-bit x86 machine */ 8: 2025:IBM developerWorks article on data alignment 1960:Computer Systems: A Programmer's Perspective 469:or on the heap with a dynamic size known as 258:is the way data is arranged and accessed in 1285:/* restore original alignment from stack */ 1200:has been replaced (and thus eliminated) by 64:Learn how and when to remove these messages 2083: 2069: 2061: 1723:GNAT Reference Manual 7.4.0w documentation 447:-byte aligned, otherwise it is said to be 424: bytes long and the datum address is 394:least-significant zeros when expressed in 2030:Article on data alignment and performance 1546:mechanism (PCI remapping, operation of a 241:Learn how and when to remove this message 223:Learn how and when to remove this message 121:Learn how and when to remove this message 1780:. July 1966. pp. 55–56. C28-6571-3. 1719:"Ada Representation Clauses and Pragmas" 1399:Allocating memory aligned to cache lines 1211:The alternative method of enforcing the 985:/* 4 bytes - largest structure member */ 1710: 1690: 1982:"1. Introduction: Segment Alignment". 1240:/* set alignment to 1 byte boundary */ 609:(align - (offset mod align)) mod align 1234:/* push current alignment to stack */ 854:(eight bytes) will be 8-byte aligned. 840:(eight bytes) will be 8-byte aligned. 833:(eight bytes) will be 8-byte aligned. 826:(eight bytes) will be 8-byte aligned. 648:Typical alignment of C structs on x86 7: 774:(four bytes) will be 4-byte aligned. 767:(four bytes) will be 4-byte aligned. 760:(four bytes) will be 4-byte aligned. 481:The CPU accesses memory by a single 161:adding citations to reliable sources 1745:SPARCompiler Ada Programmer's Guide 753:(two bytes) will be 2-byte aligned. 1575:// unaligned pointer to large area 746:(one byte) will be 1-byte aligned. 413:aligned is 8 bytes aligned). 25: 1924:"Working with Packing Structures" 738:) when compiling for 32-bit x86: 45:This article has multiple issues. 1912:6.58.8 Structure-Packing Pragmas 1617:// well-aligned pointer to 4 KiB 615: 573:required by the protocol (often 537:Padding is only inserted when a 420:when the data being accessed is 137: 75: 34: 2002:from the original on 2020-02-29 1668:. A possible implementation is 439: bytes long is said to be 148:needs additional citations for 53:or discuss these issues on the 2035:MSDN article on data alignment 1876:Kurusa, Levente (2016-12-27). 1742:"F.8 Representation Clauses". 1383:directive can only be used to 416:A memory access is said to be 1: 2092:Application binary interface 1957:; David, O'Hallaron (2003). 603:is already equal to that of 550:a structure may be declared 2045:Byte Alignment and Ordering 101:the claims made and adding 2266: 2197:Foreign function interface 1664:least significant bits of 614:Since the alignment is by 172:"Data structure alignment" 2192:Binary-code compatibility 2161:Position-independent code 1439://create array of size 10 1670: 1569: 1409: 1311: 1228: 1133: 1081: 1033: 922: 867: 657: 534:to be properly aligned. 256:Data structure alignment 1932:. Microsoft. 2007-07-09 607:, the second modulo in 1142:/* after reordering */ 1127:on linux-32bit/gcc)). 518:Data structure padding 401:The alternate wording 268:data structure padding 2245:Compiler construction 796:compile time option). 785:compile time option). 629:is a bitwise AND and 407:b/8 byte aligned 2250:Composite data types 2176:Virtual method table 1368:Default packing and 1282:#pragma pack(pop) 1237:#pragma pack(1) 1231:#pragma pack(push) 1121:(FinalPadShort) == 6 865:before compilation: 157:improve this article 2141:Memory segmentation 1544:address translation 1306:, and many others. 1125:alignof(short) == 2 560:space–time tradeoff 532:array of structures 487:primitive data type 2114:Calling convention 1857:docs.microsoft.com 1652:where aligntonext( 575:network byte order 86:possibly contains 2232: 2231: 2224:Year 2038 problem 1993:Intel Corporation 1965:Pearson Education 1955:Bryant, Randal E. 1309:Another example: 581:Computing padding 370:is a multiple of 354:A memory address 344:assembly language 330:implementations, 283:naturally aligned 251: 250: 243: 233: 232: 225: 207: 131: 130: 123: 88:original research 68: 16:(Redirected from 2257: 2202:Language binding 2085: 2078: 2071: 2062: 2014: 2008: 2007: 2001: 1990: 1978: 1941: 1940: 1938: 1937: 1920: 1914: 1909: 1903: 1898: 1892: 1891: 1889: 1888: 1873: 1867: 1866: 1864: 1863: 1849: 1843: 1842: 1840: 1839: 1829: 1823: 1822: 1820: 1819: 1809: 1803: 1802: 1800: 1788: 1782: 1781: 1775: 1765: 1759: 1758: 1756: 1755: 1750: 1739: 1733: 1732: 1730: 1729: 1715: 1698: 1695: 1680: 1677: 1674: 1648: 1645: 1642: 1639: 1636: 1633: 1630: 1627: 1624: 1621: 1618: 1615: 1612: 1609: 1606: 1603: 1600: 1597: 1594: 1591: 1588: 1585: 1582: 1579: 1576: 1573: 1533: 1530: 1527: 1524: 1521: 1518: 1515: 1512: 1509: 1506: 1503: 1500: 1497: 1494: 1491: 1488: 1485: 1482: 1479: 1476: 1473: 1470: 1467: 1464: 1461: 1458: 1455: 1452: 1449: 1446: 1443: 1440: 1437: 1434: 1431: 1428: 1425: 1422: 1419: 1416: 1415:<stdlib.h> 1413: 1394: 1390: 1382: 1378: 1371: 1363: 1360: 1357: 1354: 1351: 1348: 1345: 1342: 1339: 1336: 1333: 1330: 1327: 1324: 1321: 1318: 1315: 1286: 1283: 1280: 1277: 1274: 1271: 1268: 1265: 1262: 1259: 1256: 1253: 1250: 1247: 1244: 1241: 1238: 1235: 1232: 1225: 1221: 1214: 1207: 1203: 1199: 1188: 1185: 1182: 1179: 1176: 1173: 1170: 1167: 1164: 1161: 1158: 1155: 1152: 1149: 1146: 1143: 1140: 1137: 1126: 1122: 1112: 1109: 1106: 1103: 1100: 1097: 1094: 1091: 1088: 1085: 1078: 1074: 1064: 1061: 1058: 1055: 1052: 1049: 1046: 1043: 1040: 1037: 1030: 1029:alignof(int) * 3 1023: 1013: 1010: 1007: 1004: 1001: 998: 995: 992: 989: 986: 983: 980: 977: 974: 971: 968: 965: 962: 959: 956: 953: 950: 947: 944: 941: 938: 935: 932: 929: 926: 916: 913: 910: 907: 904: 901: 898: 895: 892: 889: 886: 883: 880: 877: 874: 871: 697: 694: 691: 688: 685: 682: 679: 676: 673: 670: 667: 664: 661: 639:two's complement 553: 393: 246: 239: 228: 221: 217: 214: 208: 206: 165: 141: 133: 126: 119: 115: 112: 106: 103:inline citations 79: 78: 71: 60: 38: 37: 30: 21: 2265: 2264: 2260: 2259: 2258: 2256: 2255: 2254: 2235: 2234: 2233: 2228: 2180: 2101: 2095: 2089: 2021: 2005: 2003: 1999: 1988: 1981: 1975: 1953: 1950: 1948:Further reading 1945: 1944: 1935: 1933: 1922: 1921: 1917: 1910: 1906: 1899: 1895: 1886: 1884: 1875: 1874: 1870: 1861: 1859: 1851: 1850: 1846: 1837: 1835: 1831: 1830: 1826: 1817: 1815: 1811: 1810: 1806: 1798: 1790: 1789: 1785: 1773: 1767: 1766: 1762: 1753: 1751: 1748: 1741: 1740: 1736: 1727: 1725: 1717: 1716: 1712: 1707: 1702: 1701: 1696: 1692: 1687: 1682: 1681: 1678: 1675: 1672: 1650: 1649: 1646: 1643: 1640: 1637: 1634: 1631: 1628: 1625: 1622: 1619: 1616: 1613: 1610: 1607: 1604: 1601: 1598: 1595: 1592: 1589: 1586: 1583: 1580: 1577: 1574: 1571: 1540: 1535: 1534: 1531: 1528: 1525: 1522: 1519: 1516: 1513: 1510: 1507: 1504: 1501: 1498: 1495: 1492: 1489: 1486: 1483: 1480: 1477: 1474: 1471: 1468: 1465: 1462: 1459: 1456: 1453: 1450: 1447: 1444: 1441: 1438: 1435: 1432: 1429: 1426: 1423: 1420: 1417: 1414: 1411: 1401: 1392: 1389:#pragma pack(8) 1388: 1380: 1379:directive. The 1376: 1373: 1369: 1365: 1364: 1361: 1358: 1355: 1352: 1349: 1346: 1343: 1340: 1337: 1334: 1331: 1328: 1325: 1322: 1319: 1316: 1313: 1288: 1287: 1284: 1281: 1278: 1275: 1272: 1269: 1266: 1263: 1260: 1257: 1254: 1251: 1248: 1245: 1242: 1239: 1236: 1233: 1230: 1223: 1219: 1212: 1205: 1201: 1197: 1190: 1189: 1186: 1183: 1180: 1177: 1174: 1171: 1168: 1166:/* reordered */ 1165: 1162: 1159: 1156: 1153: 1150: 1147: 1144: 1141: 1138: 1135: 1124: 1117: 1114: 1113: 1110: 1107: 1104: 1101: 1098: 1095: 1092: 1089: 1086: 1083: 1076: 1073:(FinalPad) == 8 1069: 1066: 1065: 1062: 1059: 1056: 1053: 1050: 1047: 1044: 1041: 1038: 1035: 1028: 1021: 1015: 1014: 1011: 1008: 1005: 1002: 999: 996: 993: 990: 987: 984: 981: 978: 975: 972: 969: 966: 963: 960: 957: 954: 951: 948: 945: 942: 939: 936: 933: 930: 927: 924: 918: 917: 914: 911: 908: 905: 902: 899: 896: 893: 890: 887: 884: 881: 878: 875: 872: 869: 699: 698: 695: 692: 689: 686: 683: 680: 677: 674: 671: 668: 665: 662: 659: 650: 645: 597: 591:modulo operator 583: 551: 520: 479: 387: 383: 352: 260:computer memory 247: 236: 235: 234: 229: 218: 212: 209: 166: 164: 154: 142: 127: 116: 110: 107: 92: 80: 76: 39: 35: 28: 23: 22: 15: 12: 11: 5: 2263: 2261: 2253: 2252: 2247: 2237: 2236: 2230: 2229: 2227: 2226: 2221: 2216: 2215: 2214: 2204: 2199: 2194: 2188: 2186: 2185:Related topics 2182: 2181: 2179: 2178: 2173: 2168: 2163: 2158: 2156:Opaque pointer 2153: 2148: 2143: 2138: 2133: 2132: 2131: 2121: 2116: 2111: 2105: 2103: 2097: 2096: 2090: 2088: 2087: 2080: 2073: 2065: 2059: 2058: 2053: 2047: 2042: 2037: 2032: 2027: 2020: 2019:External links 2017: 2016: 2015: 1979: 1973: 1949: 1946: 1943: 1942: 1915: 1904: 1893: 1868: 1844: 1824: 1804: 1783: 1760: 1734: 1709: 1708: 1706: 1703: 1700: 1699: 1689: 1688: 1686: 1683: 1671: 1570: 1539: 1536: 1466:posix_memalign 1410: 1400: 1397: 1372: 1366: 1312: 1229: 1134: 1082: 1077:alignof(float) 1034: 923: 868: 856: 855: 848: 841: 834: 827: 812: 811: 804: 797: 794:-malign-double 786: 783:-malign-double 775: 768: 761: 754: 747: 658: 653:Data structure 649: 646: 643: 595: 582: 579: 519: 516: 478: 475: 385: 358:is said to be 351: 348: 289:Data alignment 264:data alignment 249: 248: 231: 230: 145: 143: 136: 129: 128: 83: 81: 74: 69: 43: 42: 40: 33: 26: 24: 14: 13: 10: 9: 6: 4: 3: 2: 2262: 2251: 2248: 2246: 2243: 2242: 2240: 2225: 2222: 2220: 2217: 2213: 2210: 2209: 2208: 2205: 2203: 2200: 2198: 2195: 2193: 2190: 2189: 2187: 2183: 2177: 2174: 2172: 2169: 2167: 2164: 2162: 2159: 2157: 2154: 2152: 2149: 2147: 2146:Name mangling 2144: 2142: 2139: 2137: 2134: 2130: 2127: 2126: 2125: 2122: 2120: 2117: 2115: 2112: 2110: 2107: 2106: 2104: 2098: 2093: 2086: 2081: 2079: 2074: 2072: 2067: 2066: 2063: 2057: 2054: 2051: 2048: 2046: 2043: 2041: 2038: 2036: 2033: 2031: 2028: 2026: 2023: 2022: 2018: 2013: 1998: 1994: 1987: 1986: 1980: 1976: 1974:0-13-034074-X 1970: 1966: 1962: 1961: 1956: 1952: 1951: 1947: 1931: 1930: 1925: 1919: 1916: 1913: 1908: 1905: 1902: 1897: 1894: 1883: 1879: 1872: 1869: 1858: 1854: 1848: 1845: 1834: 1828: 1825: 1814: 1808: 1805: 1801:. p. 12. 1797: 1794:(July 1973). 1793: 1792:Niklaus Wirth 1787: 1784: 1779: 1772: 1771: 1764: 1761: 1747: 1746: 1738: 1735: 1724: 1720: 1714: 1711: 1704: 1694: 1691: 1684: 1669: 1667: 1663: 1659: 1655: 1568: 1565: 1562: 1558: 1556: 1551: 1549: 1545: 1537: 1408: 1406: 1398: 1396: 1386: 1367: 1353:__attribute__ 1310: 1307: 1305: 1301: 1297: 1293: 1227: 1216: 1209: 1196:. Note that 1195: 1132: 1128: 1120: 1087:FinalPadShort 1080: 1072: 1032: 1025: 1018: 973:/* 2 bytes */ 921: 866: 864: 859: 853: 849: 846: 842: 839: 835: 832: 828: 825: 821: 820: 819: 817: 809: 805: 802: 798: 795: 791: 787: 784: 780: 776: 773: 769: 766: 762: 759: 755: 752: 748: 745: 741: 740: 739: 737: 733: 729: 725: 721: 717: 713: 709: 703: 656: 654: 647: 642: 640: 636: 632: 628: 623: 621: 617: 612: 610: 606: 602: 594: 592: 588: 580: 578: 576: 572: 568: 563: 561: 555: 549: 543: 540: 535: 533: 529: 525: 522:Although the 517: 515: 511: 508: 502: 500: 496: 490: 488: 484: 476: 474: 472: 468: 463: 461: 456: 454: 450: 446: 442: 438: 433: 431: 427: 423: 419: 414: 412: 409:address (ex. 408: 405:designates a 404: 403:b-bit aligned 399: 397: 391: 381: 377: 373: 369: 365: 363: 357: 349: 347: 345: 341: 337: 333: 329: 325: 321: 317: 313: 309: 304: 302: 298: 294: 290: 286: 284: 280: 275: 273: 269: 265: 261: 257: 253: 245: 242: 227: 224: 216: 205: 202: 198: 195: 191: 188: 184: 181: 177: 174: â€“  173: 169: 168:Find sources: 162: 158: 152: 151: 146:This article 144: 140: 135: 134: 125: 122: 114: 104: 100: 96: 90: 89: 84:This article 82: 73: 72: 67: 65: 58: 57: 52: 51: 46: 41: 32: 31: 19: 2136:Machine code 2108: 2010: 2004:. Retrieved 1984: 1959: 1934:. Retrieved 1929:MSDN Library 1927: 1918: 1907: 1896: 1885:. Retrieved 1881: 1871: 1860:. Retrieved 1856: 1847: 1836:. Retrieved 1827: 1816:. Retrieved 1807: 1786: 1769: 1763: 1752:. Retrieved 1744: 1737: 1726:. Retrieved 1722: 1713: 1693: 1665: 1661: 1657: 1653: 1651: 1566: 1563: 1559: 1552: 1541: 1402: 1393:#pragma pack 1384: 1381:#pragma pack 1377:#pragma pack 1374: 1370:#pragma pack 1317:MyPackedData 1308: 1292:6 bytes 1291: 1289: 1246:MyPackedData 1217: 1210: 1194:8 bytes 1193: 1191: 1129: 1115: 1067: 1026: 1022:alignof(int) 1019: 1016: 997:/* 1 byte */ 946:/* 1 byte */ 919: 863:8 bytes 862: 860: 857: 851: 844: 837: 830: 823: 813: 807: 800: 793: 789: 782: 778: 771: 764: 757: 750: 743: 728:Digital Mars 704: 700: 651: 641:arithmetic: 630: 626: 624: 613: 608: 604: 600: 598: 586: 584: 567:memory space 564: 556: 544: 536: 521: 512: 503: 491: 480: 470: 466: 464: 457: 452: 448: 444: 440: 436: 434: 429: 425: 421: 417: 415: 406: 402: 400: 389: 379: 375: 371: 367: 359: 355: 353: 305: 300: 296: 292: 288: 287: 282: 276: 271: 267: 263: 255: 254: 252: 237: 219: 210: 200: 193: 186: 179: 167: 155:Please help 150:verification 147: 117: 111:January 2018 108: 85: 61: 54: 48: 47:Please help 44: 18:Data padding 2171:System call 2151:Object code 2102:conventions 1632:aligntonext 1405:cache lines 845:long double 801:long double 730:(DMC), and 635:bitwise NOT 622:operation. 620:bitwise AND 528:interpreter 483:memory word 350:Definitions 2239:Categories 2166:Relocation 2119:Call stack 2006:2020-02-29 1936:2011-01-11 1887:2019-08-07 1862:2019-04-01 1838:2016-06-19 1818:2012-04-13 1754:2015-08-30 1728:2015-08-30 1705:References 724:C++Builder 712:Visual C++ 616:definition 571:endianness 499:page fault 497:miss or a 430:misaligned 322:, certain 213:March 2009 183:newspapers 95:improve it 50:improve it 2109:Alignment 1296:Microsoft 1213:MixedData 1139:MixedData 928:MixedData 873:MixedData 838:long long 790:long long 708:Microsoft 552:UNALIGNED 539:structure 471:unbounded 449:unaligned 99:verifying 56:talk page 1997:Archived 1599:<< 1412:#include 1206:Padding2 1198:Padding1 1039:FinalPad 1003:Padding2 952:Padding1 720:CodeGear 524:compiler 477:Problems 2212:dynamic 2124:Library 1300:Borland 1224:#pragma 1220:alignas 852:pointer 808:pointer 716:Borland 589:is the 467:bounded 453:aligned 441:aligned 418:aligned 374:(where 364:aligned 308:Fortran 297:padding 293:padding 272:packing 197:scholar 93:Please 2219:Loader 2207:Linker 2129:static 2100:Parts, 1971:  1882:Medium 1590:malloc 1523:return 1514:return 1508:double 1502:sizeof 1442:double 1418:double 1385:reduce 1359:packed 1314:struct 1243:struct 1136:struct 1119:sizeof 1084:struct 1071:sizeof 1036:struct 925:struct 870:struct 831:double 779:double 663:MyData 660:struct 601:offset 411:64-bit 396:binary 342:, and 320:Pascal 270:, and 199:  192:  185:  178:  170:  2094:(ABI) 2000:(PDF) 1989:(PDF) 1799:(PDF) 1774:(PDF) 1749:(PDF) 1685:Notes 1517:array 1484:array 1481:& 1448:array 1344:Data3 1335:Data2 1326:Data1 1273:Data3 1264:Data2 1255:Data1 1202:Data4 1181:Data3 1172:Data2 1169:short 1160:Data4 1151:Data1 1093:short 1045:float 991:Data4 979:Data3 967:Data2 964:short 940:Data1 909:Data4 900:Data3 891:Data2 888:short 882:Data1 772:float 751:short 690:Data3 687:short 681:Data2 678:short 672:Data1 669:short 633:is a 627:& 605:align 366:when 204:JSTOR 190:books 1969:ISBN 1901:pack 1620:void 1578:void 1526:NULL 1472:void 1430:void 1341:char 1332:long 1323:char 1270:char 1261:long 1252:char 1204:and 1157:char 1148:char 1102:char 1079:)). 1054:char 1000:char 988:char 949:char 937:char 906:char 879:char 850:Any 824:long 816:LP64 806:Any 765:long 744:char 548:PL/I 526:(or 362:byte 336:Rust 326:and 316:PL/I 301:pack 277:The 176:news 1778:IBM 1555:KiB 1550:). 1548:MMU 1511:))) 1424:foo 1362:)); 1304:GNU 1178:int 1031:). 976:int 897:int 758:int 756:An 736:GCC 732:GNU 726:), 714:), 593:): 587:mod 507:MMU 495:TLB 460:x86 384:log 328:C++ 312:Ada 279:CPU 159:by 97:by 2241:: 2009:. 1967:. 1926:. 1880:. 1855:. 1776:. 1721:. 1656:, 1647:); 1644:12 1638:up 1626:ap 1614:); 1602:13 1593:(( 1584:up 1496:10 1490:64 1475:** 1469:(( 1463:== 1454:if 1356:(( 1302:, 1298:, 1279:}; 1187:}; 1111:}; 1063:}; 1012:}; 915:}; 843:A 836:A 829:A 822:A 799:A 788:A 777:A 770:A 763:A 749:A 742:A 696:}; 562:. 473:. 398:. 360:n- 340:C# 338:, 334:, 318:, 314:, 310:, 274:. 266:, 59:. 2084:e 2077:t 2070:v 1977:. 1939:. 1890:. 1865:. 1841:. 1821:. 1757:. 1731:. 1666:p 1662:r 1658:r 1654:p 1641:, 1635:( 1629:= 1623:* 1611:1 1608:- 1605:) 1596:1 1587:= 1581:* 1532:} 1529:; 1520:; 1505:( 1499:* 1493:, 1487:, 1478:) 1460:0 1457:( 1451:; 1445:* 1436:{ 1433:) 1427:( 1421:* 1350:} 1347:; 1338:; 1329:; 1320:{ 1276:; 1267:; 1258:; 1249:{ 1184:; 1175:; 1163:; 1154:; 1145:{ 1108:; 1105:n 1099:; 1096:s 1090:{ 1060:; 1057:n 1051:; 1048:x 1042:{ 1006:; 994:; 982:; 970:; 955:; 943:; 934:{ 912:; 903:; 894:; 885:; 876:{ 734:( 722:( 718:/ 710:( 693:; 684:; 675:; 666:{ 631:~ 445:n 437:n 426:n 422:n 392:) 390:n 388:( 386:2 380:n 376:n 372:n 368:a 356:a 332:D 324:C 244:) 238:( 226:) 220:( 215:) 211:( 201:· 194:· 187:· 180:· 153:. 124:) 118:( 113:) 109:( 91:. 66:) 62:( 20:)

Index

Data padding
improve it
talk page
Learn how and when to remove these messages
original research
improve it
verifying
inline citations
Learn how and when to remove this message

verification
improve this article
adding citations to reliable sources
"Data structure alignment"
news
newspapers
books
scholar
JSTOR
Learn how and when to remove this message
Learn how and when to remove this message
computer memory
CPU
Fortran
Ada
PL/I
Pascal
C
C++
D

Text is available under the Creative Commons Attribution-ShareAlike License. Additional terms may apply.

↑