0

ポインタのサイズが 4 バイトのシステムで、メモリの 2 バイト (下位部分) でアドレス可能な部分だけをアドレス指定することを意図している場合、一部の CPU にないときにポインタを 2 バイトの WORD として格納することは可能ですか?登録?次のようなポインターを宣言することによって、「twoBytes」という名前のような WORD があると仮定しても、原因はわかりません。

char * pointer = reinterpret_cast<char *>((unsigned int)(twoBytes))

4 バイトのエンティティとして保存される 4 バイトのまったく新しいエンティティを導入しています。

4

4 に答える 4

3

一般に、元のポインター値を回復するために必要な情報はほとんどありませんが、言語によって提供される保証の範囲外ですが、保存できます (特定のコンパイラーが再解釈キャストをどのように処理するかを確認する必要があります)。

ただし、Windows などでは、32 ビット ポインターの上位ワードがユーザー コード (ヌルポインターを除く) でゼロでないことだけを確認できます。これは、 MAKEINTATOMなどの Windows API マクロでは暗黙的です。最上位ワードがゼロになる可能性がある場合、API は小さな整数を表すポインターをテキスト文字列へのポインターから確実に区別できませんでした。

したがって、一般に、カーネル プログラミングを行っていない限り、そのように最適化しても何も得られません。また、数バイトを節約しても、複雑さが増しただけの価値はほとんどありません。

乾杯 & hth.,

于 2010-11-04T16:26:26.553 に答える
2

あなたが説明していることは、言語内からできることよりも、コンパイラ機能 (古き良き時代の「近い」ポインター) のように聞こえます。あなたが使用しているコンパイラを作った人に相談してください。GCC でこの動作を実装できるという理論上の可能性を保証できますが、それはお尻の大きな痛みになると思います。

別のハックとして、ベース ポインターと「unsigned short」オフセットを使用して、必要なもののほとんどを取得できる場合があります。

于 2010-11-04T16:24:22.157 に答える
1

名前付きの4バイトエンティティなしで使用することもできます。

((char*)(unsigned)twoBytes)[idx] = some_val;

twoBytesメモリ内で2バイトしか使用しません。これをchar*にキャストすると、コンパイラーは実際にデータをアドレス指定するために4バイトの値を作成しますが、それは表示されず、レジスターにのみ存在する可能性があります。それがあなたが求めていたものだと思います。

于 2010-11-04T16:33:34.517 に答える
1

いいえ、同じ理由で、「bike」という単語を 2 バイトで格納することはできません。データが収まりません。ポインターを非ポインター型にキャストしないでください。多くの場合、移植性がなく、切り捨てが静かに導入され、厄介なバグが発生する可能性があります。

于 2010-11-04T15:43:54.010 に答える