对于像这样工作的IO操作,我获得了一个C ++框架(我无法改变):
block_size
,这是读取或写入的块的大小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
。
所以当我这样做时:
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
我在读取过程中遇到问题,因为将读取比我想要的更多的字节,可能会破坏堆栈。
如果sizeof(X) > block_size
我在写入期间遇到问题,因为不会写入X
的每个字节,所以我的备份不完整。
我想将每个块用于X
的一个实例,我可以确保sizeof(X) < block_size
。有没有办法如何向X
添加一些填充字节,所以它有block_size
个字节?
答案 0 :(得分: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
(通过填充)或使用分配技巧(总是在block_size区域中分配X,永远不要在堆栈上使用)。但是在写入/读取之前复制是最简单的,也是最棘手的。