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

How to make C++ class have specific size in memory

本文关键字:何使类 C++ 内存      更新时间:2023-10-16

我得到了一个用于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字节?

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类型必须是内存安全的。

书中还有更多技巧,例如使sizeof(X)始终匹配block_size(通过填充)或使用分配技巧(始终在block_size区域中分配X,切勿在堆栈上使用)。但是写入前/读取后复制是最简单,最不棘手的。