目的私はに対応(タイプvoid *
の)そのパラメータかどうかを伝えることができます機能と同様のmalloc/reallocを/無料のラッパー関数を提供し、より大きなプロジェクトのための小さなライブラリを書いていますCのポインタへのバイトレベルアクセスにはどのような移植性の問題が関係していますか?
ライブラリーのラッパー関数によって割り当てられて管理されるライブ(未だ解放されていない)メモリー。この関数を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
バイト単位でアクセスすると、うんざりしたアライメントの問題が発生しますか?
エンディアンが問題になる可能性があります。 – cobbal
プログラム内でのハッシングのためだけであるため、エンディアンは固定されており、どのエンディアンが適用されるかは関係ありません。 –
私はリトルエンディアンプラットフォームからビッグエンディアンプラットフォーム(私がアクセスできるSun Microsystemsサーバー)に移植しました。すべてが正常に動作しているようです。 –