将多类型数据存储在非类型化存储器空间中

storing multi-type data in untyped memory space

本文关键字:类型化 存储器 空间 多类型 数据 存储      更新时间:2023-10-16

在下面的代码示例中,如何使*y指向偏移量4?现在,只指向偏移量0,偏移量0表示*x,而不是*y。

(注意*x&*y每个将有4个字节)

unsigned char *p = new unsigned char[8];
int *x = &*(int *) p;
*x = 1;
int *y = &*(int *) p;
*y = 2;

请不要谈论结构或其他方式,它们对我没有帮助。

如果您实际上将多个类型存储在一个连续的缓冲区中,那么在对齐问题上,您可能会遇到麻烦。并非所有类型都可以在相同的内存边界上对齐:有些类型可能需要32位对齐,有些类型需要64位对齐,还有一些类型需要128位对齐,这完全取决于平台。

一些阅读可以让你开始,但你应该更多地阅读,包括用户定义类型的对齐,以及你所针对的各种编译器和操作系统,如果你真的想在不使用更结构化的方法的情况下做到这一点(例如:结合静态和动态多态性的变体类型方法)。

事实上,如果你想做到这一点,你需要了解的材料与你在实现自己的内存分配器时必须了解的关于数据对齐的内容非常相似(通用内存分配器必须处理能够将多个类型存储在连续缓冲区中的问题),因此搜索类似的主题可能会给你所需要的。我不得不说,这个低级的问题可能会给你和任何同事带来比任何人都应该得到的更多的悲伤。

您需要知道哪些类型需要与哪些边界对齐(字节、字、双字、四字)。它也各不相同。例如,你不必存储一个在单词边界上不对齐的int。在某些系统上,这可能会对未对齐的移动造成巨大的性能损失,甚至会使程序崩溃。这也是为什么结构通常在内部有填充,以确保所有数据都正确对齐。

然而,对于你的直接例子,它不是混合类型(只是整数):

unsigned char *p = new unsigned char[sizeof(int) * 2];
int *x = &*(int *) p;
*x = 1;
// advance your unsigned char* pointer by the size of x
p += sizeof x; // or sizeof(int)
int *y = &*(int *) p;
*y = 2;
#include <cstdint>
unsigned char *p = new unsigned char[8];
int32_t *x1=reinterpret_cast<int*>(p);
int32_t *x2=reinterpret_cast<int*>(p+4);

也就是说,请你确切地告诉我们你在更大范围内试图做什么——几乎肯定有更好的方法。

还请使用特定大小的类型,这种类型的编程充满了痛苦。