malloc() はシングルスレッドだと単に brk() / sbrk() システムコールを実装したものと考えれば良いのですが、マルチスレッドにすると一気に複雑になります。
それで malloc() の実装は大昔には dlmalloc() というのを使ってたらしいですが、最近は ptmalloc() というのが標準みたいです。
dlmalloc() / ptmalloc() もいずれも十分に複雑なんですが、dlmalloc() はスレッドを考えない分かなりシンプルな方に分類できますかね。
それでこの項目では malloc() という時は ptmalloc() のことを言います。
もちろん malloc() の中身を全て理解している人なんて、一部の猛者を除いて滅多にお目にかかれませんし、ptmalloc() となると尚更難しくなります。
なので筆者が説明できる範囲も、筆者の理解が及び部分だけになります。
まあ大したことないっすよ…
(´・ω・`)
それと malloc にはいくつか基本使用みたいなものがあります。
それと 8 バイトのポインターの割り当てサイズは最低でも 24/32 バイトになります。
最大だと 2^64 - 2 ページ(筆者の検証環境では 1 ページは4096)となります。
詳細は malloc.c に記述されていますので、チェックしておいてくださいね。
malloc.c(https://github.com/MacKomatsu/glibc/blob/release/2.27/master/malloc/malloc.c).
93 Supported pointer representation: 4 or 8 bytes 94 Supported size_t representation: 4 or 8 bytes 95 Note that size_t is allowed to be 4 bytes even if pointers are 8. 96 You can adjust this by defining INTERNAL_SIZE_T 97 98 Alignment: 2 * sizeof(size_t) (default) 99 (i.e., 8 byte alignment with 4byte size_t). This suffices for 100 nearly all current machines and C compilers. However, you can 101 define MALLOC_ALIGNMENT to be wider than this if necessary. 102 103 Minimum overhead per allocated chunk: 4 or 8 bytes 104 Each malloced chunk has a hidden word of overhead holding size 105 and status information. 106 107 Minimum allocated size: 4-byte ptrs: 16 bytes (including 4 overhead) 108 8-byte ptrs: 24/32 bytes (including, 4/8 overhead) //略 126 Maximum allocated size: 4-byte size_t: 2^32 minus about two pages 127 8-byte size_t: 2^64 minus about two pages //略 146 Thread-safety: thread-safe
アラインメント(Alignment)は 2 * sizeof(size_t) がデフォルト値になります。
この値は MALLOC_ALIGNMENT の目安となります。
筆者のうろ覚えだと 32 ビットアーキテクチャなら 8 バイト、64 ビットアーキテクチャなら 16 バイトになるでしょう。
ああそれと malloc() はスレッドセーフなので、マルチスレッドで使っても特に何もしなくても大丈夫だともコメントには書いていますね。
Copyright 2018-2019, by Masaki Komatsu