2017-04-11 19 views
2

に特定のサイズを持っている:それはブロックのサイズであるblock_sizeを持って私はこのように動作しますIO操作のためのC++フレームワーク(私は変更できないことを)与えられていたメモリ

  • をそれは、それぞれのリード/ライト動作は、この操作構造体を取得します
  • 読み取りまたは書き込みさ:
struct Operation { 
    size_t block; // index of external memory block 
    void * data; // here the data will be written or read from 
} 

実際の読み取りまたは書き込み、次のようになります

Operation o; 
o.block = 42; // index of block i want to read from 
o.data = // where i want the data to end up 
io.read(o); 

問題は、読み取り/書き込みがmemcpyで実装されており、それは常にblock_sizeバイトのブロックを移動していることです。しかし、この外部メモリにクラスXを保存してロードしたいときには、おそらくsizeof(X) != block_sizeが原因で問題が発生します。

だから私はこれを行うだろうというとき:私は必要以上のバイトは、おそらくスタックを破壊、読み込まれますので、私は、読み取り中に問題を持っているsizeof(X) < block_size場合

X x; 
Operation o; 
o.block = 42; // index of block i want to read from 
o.data = &x; 
io.read(o); 

io.write(o); 

sizeof(X) > block_size書き込み中に問題が発生した場合は、Xのすべてのバイトが書き込まれるわけではないので、バックアップが不完全です。

Xの1つのインスタンスに対してそれぞれのブロックを使用したいと思います。sizeof(X) < block_sizeを確認することができます。一部のパディングバイトをXに追加する方法はありますか?正確にはblock_sizeバイトですか?

+0

'block_size'はコンパイル時に知られていますか? –

+0

内部的にパディングを追加するオブジェクトアロケータが役に立ちます。 – felix

+0

@FabioTuratiはいblock_sizeはコンパイル時定数です。 – Jeysym

答えて

2
X x; 
Operation o; 
o.block = 42; // index of block i want to read from 
o.data = &x; 
io.read(o); 

あなた自身が言ったように、それはできません。あなたは、その後、該当するクラスにblock_sizeブロックにポイントをコピーする必要があり

BYTE buffer[block_size]; 
X x; 
Operation o; 
o.block = 42; // index of block i want to write to 
o.data = buffer; 
io.read(o); 
memcpy(&x, buffer, sizeof(X)); 

同上(あなたは単にあなたが崖から落ちる可能性があるため、Xの終了後であることを起こるものは何でも書くことができない書き込みのマップされていないページに):

BYTE buffer[block_size]; 
X x; 
Operation o; 
o.block = 42; // index of block i want to read from 
o.data = buffer; 
memcpy(buffer, &x, sizeof(X)); 
io.write(o); 

インターフェイス自体の正当性については言及しません。そしてstatic_assert(sizeof(X) <= block_size)。また、タイプXはmemcopyセーフでなければなりません。

sizeof(X)を(パディング経由で)block_sizeと常に一致させるか、割り振りトリックを使用する(常にブロックサイズ領域でXを割り振り、スタックで使用しないでください)などのテクニックがあります。しかし、書き込み前/書き込み後のコピーは、最もシンプルで、最もトリッキーです。

関連する問題