Ned Batchelderが指摘した基本的な問題に加えて、はるかに微妙な問題は、割り当てられているオブジェクトに適切に配置されたアドレスをアロケータが返さなければならないことです。一部のプラットフォーム(x86)では、パフォーマンスの問題を除いてこれは問題にならない場合がありますが、多くのプラットフォームでは、これは完全な取引ブレーカーです。
また、ポインター演算を実行するために(char*)
キャストを実行する必要がありましたstack
(型に対してポインター演算を実行することはできませんvoid*
)。
MAX_MEMORY
そして、マクロ内の式の周りに親を配置する必要があります。乗算よりも優先順位の高い演算子はすべて正しい構文ではないため、これらがないと優先順位の問題が発生することはないと思います。マクロを使用すると、後悔するよりも常に安全です。(演算子が式全体ではなく、に[]
のみバインドできる例外が少なくとも1つありますが、構文的に有効であっても、表示するのは非常に奇妙な状況になります)。2
MAX_MEMORY
MAX_MEMORY[arrayname]
実際のところ、私はそれを列挙型にしたでしょう。
システム上の基本的なデータ型に合わせて適切に配置されたメモリブロックを返すことで、アロケータを単純に保つことができます(おそらく8バイトの配置)。
/* Note: the following is untested */
/* it includes changes suggested by Batchelder */
#include <stdio.h>
#include <unistd.h>
enum {
kMaxMemory = 1024 * 1024 * 2, /* 2MB of memory */
kAlignment = 8
};
void *stack = NULL; /* pointer to available stack */
void * memoryAlloc( size_t size) {
void *pointer;
size = (size + kAlignment - 1) & ~(kAlignment - 1); /* round size up so allocations stay aligned */
if (stack == NULL)
stack = sbrk(kMaxMemory); /* give us system memory */
pointer = stack; /* we always have space :) */
stack = (char*) stack + size; /* move in stack forward as space allocated */
return pointer;
}