0

何かを理解するのを手伝ってください。

を使用して..import sun.misc.Unsafe;

0-127範囲外の文字を防ぐために、文字をメモリアドレスに配置する必要がある場合は、これを行います

if (0 != (c & 0xFF80)) {
    throw new RuntimeException("Only Ascii characters are supported. 0-127.");
} else {
    // Since Java's chars are 16 bits long, i cast it 
    // to byte (8 bits) and then `putByte()`
    UNSAFE.putByte(address, (byte) c);
}

私のテストがそのメモリの内容をチェックするとき

    char c1 = Ascii.a;
    asciiEncoder.encode(address, c1);
    assertThat(unsafe.getChar(address), is(c1));

このテストは、一部のマシンで成功したり失敗したりするようです。繰り返しますが、これは一部の MAC では機能し、他の MAC では機能せず、一部の Windows では機能し、他の Windows では機能しません。

何が失敗していますか?'a' 以外の文字が返されます。

私が理解しているように、割り当て時にメモリがクリーンアップされていない場合、これは可能ですが、これはこれを処理しませんか?

@Before
public void setUp() {
    address = unsafe.allocateMemory(64); // Isn't this mem clean?
} 

これを 8 ビットに変更すると、テストは常にパスします

@Before
public void setUp() {
    address = unsafe.allocateMemory(8);
} 

理解を助けてください

4

1 に答える 1

2

JavaDoc forUnsafe#allocationMemoryは次のように述べています。

指定されたサイズ (バイト単位) のネイティブ メモリの新しいブロックを割り当てます。メモリの内容は初期化されていません。それらは一般にガベージになります。結果のネイティブ ポインターがゼロになることはなく、すべての値の型に対して整列されます。#freeMemory を呼び出してこのメ​​モリを破棄するか、 #reallocateMemory でサイズを変更します。

つまり、byteそこに置いて読み返すとchar、余分なバイトのゴミが得られます。

于 2013-05-23T20:39:45.067 に答える