アラインメントの最少サイズはプラットフォームによって変わるのですが、計算式は以下ソースコードの MALLOC_ALIGNMENT マクロの定義の通りです。
malloc-alignment.h(https://github.com/MacKomatsu/glibc/blob/release/2.27/master/sysdeps/generic/malloc-alignment.h).
22 /* MALLOC_ALIGNMENT is the minimum alignment for malloc'ed chunks. It 23 must be a power of two at least 2 * SIZE_SZ, even on machines for 24 which smaller alignments would suffice. It may be defined as larger 25 than this though. Note however that code and data structures are 26 optimized for the case of 8-byte alignment. */ 27 #define MALLOC_ALIGNMENT (2 * SIZE_SZ < __alignof__ (long double) \ 28 ? __alignof__ (long double) : 2 * SIZE_SZ)
少し難し目ではありますが 64 ビットでは SIZE_SZ が 8 バイトになる前提で最少値の検証をしてみます。
1 #include <iostream> 2 3 #define SIZE_SZ 8 4 #define MALLOC_ALIGNMENT (2 * SIZE_SZ < alignof(long double) \ 5 ? __alignof__ (long double) : 2 * SIZE_SZ) 6 7 int main() 8 { 9 std::cout << alignof(long double) << '\n'; 10 std::cout << MALLOC_ALIGNMENT << '\n'; 11 }
ビルドと出力結果.
$ g++ main.cpp $ ./a.out 16 16
単にマクロの結果を表示しただけですが、このケースだと最少アラインメントサイズは alignof() の結果と同じになっています。
Copyright 2018-2019, by Masaki Komatsu