2016-12-08 2 views
4

アラインメントの倍数。aligned_alloc機能要件

ただし、サンプルコードはこのようにそれを使用しています。

int *p2 = aligned_alloc(1024, 10*sizeof *p2); 

10 * sizeof演算子* pが40に等しいので、それは1024

の整数倍ではありません、私は何を誤解していますか? your own referenceによれば

+1

私は誤っていると思います:おそらく、int * p2 = aligned_alloc(1024、1024 * sizeof * p2);または 'int * p2 = aligned_alloc(10、10 * sizeof * p2); '?もちろんintのサイズは2,560であるかもしれませんが、私はそれを疑っています。 – chux

+0

これはタイプミスかもしれませんが、コードはそのままコンパイルされ、正常に動作します。私はGCC 4.9を使用しています。 – MichaelSB

+0

cppreferenceドットコムは一般的にC++に関する情報にとって非常に悪い情報源であり、Cについての情報はさらに悪いです。それは、言語を説明し明確にするのではなく、言語が何を言っているかのような不正確な言い方によく似ています。 –

答えて

1

:有効でないか、または実装によってサポートされていないalignment又はalignmentの整数倍でないsizeを渡す

関数はヌルポインタ(C11失敗とリターンさせますこの場合、未定義の動作が指定されていますが、これはDR 460によって修正されました)。

DR460用に更新されていないC11ルールに従い、この場合は「未定義」と判断されたコンパイラが「Works」を意味する可能性があります。もちろん、「成功ですが、整列されていないか、アラインメントバイトを最小に割り当てる」ことも意味します。それは未定義です。コード例については肩をすくめ

は、それはコメントで提案されているように、それがあるように意図されている可能性があり(その明確化する前に書かれており、標準的な要件に合わせていない、またはそれを書いてタイプミスがあったされている可能性が1024 * sizeof *p2 )。

4

実際には、C11標準は自らの考え方を変えることができず、要件を変更し続けているようです:最初は未定義の動作でしたが、DR 460では失敗してヌルポインタを返しました。彼らは引数として任意の値を受け入れるように変更したい: http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2072.htm

コンパイラはこれらの制限に気をつけていないようだ。

+1

標準委員会がそれを変更して、SIMDの使用に失敗する必要があるように、64Bで整列された 'float'の配列を16の倍数で割当てるなどの場合は、本当に残念です。または、2Mの大きなページ境界に合わせて大きなバッファを割り当てるため。これは、あなたが 'free'に渡すことができるポインタを返す優れたAPIを持つ唯一の関数でした。実際の実装がその愚かな設計に従わないのはいいことですが、それは移植可能な配列の割り当てがまだ達成できなくなっていることを意味します。 –

+0

サイズがアラインメントの倍数でなければならないという要件は、他のすべてのアロケータ関数が要求されたサイズ以上である限り、割り当てられることを考慮すると愚かです。したがって、要件の技術的な理由があっても(私はそれが何であるか不思議です)、aligned_allocは単に内部的に関数を切り上げることができます。また、整列引数は、必要な整列ではなく、基数2の対数である必要があります。そうすれば、その関数への無効な入力はありません。 – PSkocik

関連する問題