1. ホーム
  2. c++

[解決済み] mallocはアライメントをどのように理解しているのですか?

2022-03-11 11:29:48

質問

より抜粋したものです。 こちら

<ブロッククオート
pw = (widget *)malloc(sizeof(widget));

は生のストレージを確保します。実際 malloc 呼び出しはストレージを割り当てます 十分な大きさがあり オブジェクトを保持するために適切に整列された 型の ウィジェット

も参照してください。 高速pImpl ハーブ・サッターからだという。

アライメント . 任意のメモリ アライメント. 割り当てられた任意のメモリ 動的に new や malloc を使用した場合、適切にアライメントされることが保証されています。 に対して しかし、動的に割り振られないバッファは、どのような型であっても そのような保証はない

これについては興味があるのですが、mallocはどのようにしてカスタムタイプのアライメントを知るのでしょうか?

どのように解決するのですか?

アライメント要件は再帰的である。任意の struct は、単純にそのメンバの中で最大のアライメントであり、これは再帰的に理解される。

例えば、各基本型のアライメントがそのサイズと等しいと仮定すると(これは一般的には常に正しいとは限らない)。 struct X { int; char; double; } は、アライメントが double の倍数になるようにパディングされます(例:4 (int), 1 (char), 3 (padding), 8 (double)).このとき struct Y { int; X; float; } のアライメントを持ちます。 X のアライメントと同じであり、最大である。 double であり、かつ Y がそれなりにレイアウトされている。4 (int), 4 (padding), 16 (X), 4 (float), 4 (padding) となります。

(すべての数値は例であり、お使いのマシンによって異なる可能性があります)。

したがって、基本的な型に分解することで、基本的な整列は一握りだけ知っていればよく、その中でもよく知られた最大のものがあります。C++では、型まで定義しています。 max_align_t そのアライメント その最大のアライメント

すべて malloc() は、その値の倍数であるアドレスを選ぶ必要があります。