54.3. アラインメントの最少サイズ

 アラインメントの最少サイズはプラットフォームによって変わるのですが、計算式は以下ソースコードの 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