Dynamic Memory Allocation for Over-Aligned Data

This lesson explains memory alignment in C++ 17 and how it fixes the holes in C++11/14 memory alignment.

We'll cover the following

Embedded environments, kernel, drivers, game development and other areas might require a non-default alignment for memory allocations. Complying those requirements might improve the performance or satisfy some hardware interface.

Memory Alignment

For example, to perform geometric data processing using SIMD[^simd] instructions, you might need 16-byte or 32-byte alignment for a structure that holds 3D coordinates:

[^simd]: Single Instruction, Multiple Data, for example, SSE2, AVX, see https://en.wikipedia.org/wiki/Streaming_SIMD_Extensions

struct alignas(32) Vec3d { // alignas is available since C++11
    double x, y, z;
};
auto pVectors = new Vec3d[1000];

Vec3d holds double fields, and usually, its natural alignment should be 8 bytes. Now, with alignas keyword, we change this alignment to 32. This approach allows the compiler to fit the objects into SIMD registers like AVX (256-bit-wide registers).

Get hands-on with 1400+ tech skills courses.