目的
私は、malloc / realloc / freeラッパー関数と、そのパラメーター(タイプvoid *
)が割り当てられ管理されているライブ(まだ解放されていない)メモリに対応するかどうかを通知できる関数を提供する、より大きなプロジェクト用の小さなライブラリを作成しています。ライブラリのラッパー関数によって。この関数を。と呼びましょうisgood_memory
。
内部的には、ライブラリはハッシュテーブルを維持して、によって実行される検索isgood_memory
が適度に高速であることを確認します。ハッシュテーブルは、検索を可能にするためにポインタ値(タイプの要素)を維持します。void *
明らかに、値はハッシュテーブルに追加および削除され、割り当てられたものと解放されたものをそれぞれ最新の状態に保ちます。
ライブラリの移植性は私の最大の関心事です。これは、ほとんど準拠したC90(ISO / IEC 9899:1990)環境のみを想定するように設計されています...それ以上のものはありません。
質問
移植性が私の最大の関心事であるsizeof(void *) == sizeof(X)
ため、ハッシュ関数についてはそれを想定できませんでした。したがって、私は値をバイトごとに文字列であるかのように扱うことに頼ってきました。これを実現するために、ハッシュ関数は次のようになります。
static size_t hashit(void *ptrval)
{
size_t i = 0, h = 0;
union {
void *ptrval;
unsigned char string[sizeof(void *)];
} ptrstr;
ptrstr.ptrval = ptrval;
for (; i < sizeof(void *); ++i) {
size_t byte = ptrstr.string[i];
/* Crazy operations here... */
}
return (h);
}
この特定のフラグメントに関して、移植性に関してどのような懸念がありますか?ptrval
バイトごとにアクセスすることで、ファンキーな配置の問題が発生しますか?