3

重複の可能性:
アラインされたメモリ管理?

私はこのように宣言している配列を持っています

int * myarray;
int num_of_element;

myarry = (int*) calloc(num_of_elements, sizeof(int));

int のサイズは 4 バイトですが、配列が 8 バイト境界で始まるようにしたいので、毎回 2 つの値を効率的にロードできます。別の方法や他にできることはありますか?

4

2 に答える 2

2

いくつかの方法があります。

  1. 過剰に割り当て、返されたアドレスを目的の配置に切り上げます。

  2. アライメントが望ましいものである型で共用体を定義します。一般的にはdoubleです。これには低レベルの知識が必要ですが、配列を割り当てたい場合には最適ではありません。

malloc()また、 Cの戻り値をキャストしないでください

于 2012-09-18T14:05:48.667 に答える
2

試しましたposix_memalignか?

関数 posix_memalign() はsize、バイトを割り当て、割り当てられたメモリのアドレスを に配置します*memptr。割り当てられたメモリのアドレスは の倍数にalignmentなります。これは、2 の累乗と の倍数でなければなりませんsizeof(void *)

例:

if (posix_memalign(&myarray, 8, num_of_elements*sizeof(int)) != 0) {
    // failed
}

http://pubs.opengroup.org/onlinepubs/009696699/functions/posix_memalign.htmlを参照してください。

Linux posix_memalign マンページには、aligned_alloc() (c11)、memalign() (廃止) も記載されています。

https://www.kernel.org/doc/man-pages/online/pages/man3/posix_memalign.3.html

于 2012-09-18T14:06:20.933 に答える