重複の可能性:
アラインされたメモリ管理?
私はこのように宣言している配列を持っています
int * myarray;
int num_of_element;
myarry = (int*) calloc(num_of_elements, sizeof(int));
int のサイズは 4 バイトですが、配列が 8 バイト境界で始まるようにしたいので、毎回 2 つの値を効率的にロードできます。別の方法や他にできることはありますか?
重複の可能性:
アラインされたメモリ管理?
私はこのように宣言している配列を持っています
int * myarray;
int num_of_element;
myarry = (int*) calloc(num_of_elements, sizeof(int));
int のサイズは 4 バイトですが、配列が 8 バイト境界で始まるようにしたいので、毎回 2 つの値を効率的にロードできます。別の方法や他にできることはありますか?
いくつかの方法があります。
過剰に割り当て、返されたアドレスを目的の配置に切り上げます。
アライメントが望ましいものである型で共用体を定義します。一般的にはdouble
です。これには低レベルの知識が必要ですが、配列を割り当てたい場合には最適ではありません。
試しました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