如何使C ++类在内存中具有特定的大小

时间:2017-04-11 14:13:54

标签: c++ io memcpy

对于像这样工作的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个字节?

1 个答案:

答案 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,永远不要在堆栈上使用)。但是在写入/读取之前复制是最简单的,也是最棘手的。