在非类型化的内存空间中存储多类型数据

时间:2012-03-02 00:11:17

标签: c++ pointers

在下面的代码示例中,如何使* y指向偏移量4? 现在,只指向偏移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;

请不要谈论结构或其他方式,他们不会帮助我。

2 个答案:

答案 0 :(得分:1)

#include <cstdint>

unsigned char *p = new unsigned char[8];
int32_t *x1=reinterpret_cast<int*>(p);
int32_t *x2=reinterpret_cast<int*>(p+4);

那就是说,请你告诉我们你在更广泛的范围内尝试做什么,几乎肯定有更好的方法。

请使用特定尺寸的类型,这种类型的编程充满了痛苦。

答案 1 :(得分:1)

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

Some reading to get you started,但您应该阅读更多内容,包括用户定义类型的对齐方式,以及您要定位的各种编译器和操作系统,如果您真的希望以不使用的方式执行此操作更结构化的方法(例如:Variant类型方法结合静态和动态多态)。

事实上,如果你想这样做,你需要了解的那种材料与你在实现自己的内存分配器时必须学习的数据对齐非常相似(一般的内存分配器必须处理能够在连续的缓冲区中存储多个类型),因此搜索类似的主题可能会为您提供所需的内容。我不禁要说,这个低级别的问题可能会给你和任何同事带来比任何人应得的更多的悲痛。

您需要知道哪些类型需要与哪些边界(字节,字,双字,四字)对齐。它也有所不同。例如,您无法在必要时存储未在字边界上对齐的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;