7

std::basic_string の libc++ 実装を見ていると、 1374 行目 (執筆時) でこれに遭遇しました。

enum {__alignment = 16};

この値は、後続のアラインメント計算で使用され、文字列サイズのリクエストはこの数値の倍数に切り上げられます。

メモリの断片化などを避けるために丸めが行われていることは受け入れられますが...

ここでハードコードされた16を数値として使用する背後に特定の論理的根拠があるのか​​ 、それとも「ナイスな「ラウンド」数値」として使用されているだけなのか疑問に思います。

64 ビット マシンの16場合alignof( std::max_align_t )、 は になり、これにはある程度の意味があります。しかし、まったく同じ値__alignmentが 32 ビット アーキテクチャにも使用されるので、...?

4

1 に答える 1

5

私が最初に を設計したとき<string>、libc++ はまだオープンソースになる予定ではありませんでした。私は Apple のプラットフォームについてのみ書いていました。また、Applemallocは常に少なくとも 16 バイトを割り当て、16 バイトの倍数で、いくら要求しても割り当てます (少なくとも 2007 年にはこれが当てはまりました。最近は確認していません)。

したがって、最も一般的に使用されるアロケーターが 16 バイトを提供する場合は、それらを容量内で使用することもできます。

数年前のある時、アロケーター API を変更して、特定のリクエストに対して実際に割り当てられたメモリ量をアロケーターに問い合わせることができるようにしました。しかし、その試みは失敗しました。したがって、次善の策は、コードが処理する最も一般的なアロケーターのアプリオリな知識を利用することでした。

于 2018-05-23T21:11:16.630 に答える