それでアラインメントがとれたという話がピンとこない向けに最後に一つ例を出しておきます。
16 バイト境界は簡単に言うとアドレスの下一ケタが 0 から始まるってことですが、ではもっと大きめなアラインメントにすると割り当てたアドレスがどうなるかチェックしてみましょう。
main.c.
1 #include <stdlib.h> 2 #include <stdio.h> 3 4 int main() 5 { 6 void *old_ptr; 7 void *new_ptr; 8 int ret; 9 10 ret = posix_memalign(&old_ptr,4096,sizeof(int)*16); 11 if(ret != 0){ 12 perror("posix_memalign"); 13 exit(1); 14 } 15 printf("posix_memalign(4096): 0x%lx\n",(unsigned long)old_ptr); 16 17 ret = posix_memalign(&new_ptr,256,sizeof(int)*16); 18 if(ret != 0){ 19 perror("posix_memalign"); 20 exit(1); 21 } 22 printf("posix_memalign(256): 0x%lx\n",(unsigned long)new_ptr); 23 24 free(old_ptr); 25 free(new_ptr); 26 27 old_ptr = aligned_alloc(4096,sizeof(int)*16); 28 printf("aligned_alloc(4096): 0x%lx\n",(unsigned long)old_ptr); 29 30 new_ptr = aligned_alloc(256,sizeof(int)*16); 31 printf("aligned_alloc(256): 0x%lx\n",(unsigned long)new_ptr); 32 33 free(old_ptr); 34 free(new_ptr); 35 36 return 0; 37 }
ビルドと実行結果.
$ gcc main.c $ ./a.out posix_memalign(4096): 0x564434497000 posix_memalign(256): 0x564434496700 aligned_alloc(4096): 0x564434498000 aligned_alloc(256): 0x564434496900
一目瞭然かは分かりませんが 4096 バイトのアラインメントを指定すると、下三桁が 0 になってますね。
通常のアラインメントは 16 バイト境界が良いとは思いますが、特定のアラインメントを要求する CPU やプロセッサーを使う場合に大きめのアラインメントを取ることがあります。
つまりはキャッシュラインに最適化したいと思ったり、特殊な CPU を使うという用途でも無い限りはアラインメントは無視しても大丈夫かと思います。
Copyright 2018-2019, by Masaki Komatsu