質問

私自身のメモリプールで実施んに少し戸惑いポイント合わせ---

そしているメモリプールハウのサイズは一定のメモリブロック、ポイントのメモリプールで作成しmalloc((サイズ)-(numのブロック)).まだ割り当てられることはオブジェクトのサイズからsizeofオペレーターの配置などを懸念し、そのサイズが均一でな(しようと100バイトブロックのための何らかの理由で)、その後、時分割のチャンクされたmallocいで終わunalignedのポインタ.私の質問はいつものブロックの一部に境界があり?

役に立ちましたか?

解決

X86まなアライメントが性能が良い場合のデータが揃います。アラインメント タイプ 一般的にsizeof(タイプ)、16(バイト単位)。

わたしは、この馬鹿げ試験プログラムん(asuming malloc何がそうで返します16っamd64ます。を返します8時計の32ビットモード:

#include <stdlib.h>
#include <stdio.h>

int main() {
    int i;
    unsigned long used_bits = 0, alignment;

    for (i = 0; i < 1000; ++i) {
        used_bits |= (unsigned long)malloc(1);   /* common sizes */
        used_bits |= (unsigned long)malloc(2);   
        used_bits |= (unsigned long)malloc(4);
        used_bits |= (unsigned long)malloc(8);
        used_bits |= (unsigned long)malloc(16);
        used_bits |= (unsigned long)malloc(437); /* random number */
    }

    alignment = 1;
    while (!(used_bits & alignment)) {
        alignment <<= 1;
    }

    printf("Alignment is: %lu\n", alignment);
    return 0;
}

他のヒント

適切なアライメントを少なくとももを性能的に)ほとんどのx86実装(一部のようなアライメントが実際に必須の他建築).だいcallocい)のための引数は、サイズのバイト数だけでなく、一つのサイズをバイトでは、mallocな);そこで本質的にalign(下のブロックサイズ)の次に高出力の2つの上項目サイズはスイッチを複数の16バイト以上16日だ倍増永遠のように、@derobert勧告すると説明してい!-).この場合、呼び出し側うNバイトw/o他の配置やパディングで常に求め、Nは1バイトの各(ようcallocと同じ理由;-).

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top