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

C++ 在非类型化内存空间中存储多类型数据,c++,pointers,C++,Pointers,在下面的代码示例中,如何使*y指向偏移量4? 现在,只指向偏移量0,这表示*x,而不是*y (请注意,*x&*y每个将有4个字节) 请不要谈论struct或其他方式,它们不会帮助我。\include #include <cstdint> unsigned char *p = new unsigned char[8]; int32_t *x1=reinterpret_cast<int*>(p); int32_t *x2=reinterpret_cast<int*&g

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

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

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

\include
#include <cstdint>

unsigned char *p = new unsigned char[8];
int32_t *x1=reinterpret_cast<int*>(p);
int32_t *x2=reinterpret_cast<int*>(p+4);
无符号字符*p=新的无符号字符[8]; int32_t*x1=重新解释铸件(p); int32_t*x2=重新解释铸件(p+4);
也就是说,请你确切地告诉我们你在更大范围内尝试做什么,几乎肯定有更好的方法


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

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

,但是您应该阅读更多的内容,包括用户定义类型的对齐,如果您真的想不使用更结构化的方法(例如:结合静态和动态多态性的变体类型方法)而以现在的方式来执行此操作,那么对于您要针对的各种编译器和操作系统,您应该阅读更多内容

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

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

但是,对于不是混合类型(只是整数)的直接示例:


可能是我两个小时来找的东西的复制品。。。谢谢,好的。我想在内存中随机存储多种数据类型。有更好的方法吗?@user1243815嗯,有:
intx=1;int y=2
@jrok:我不能这么说。如果这是你想要的,请接受答案,如果这个“堆”是完全非结构化的,那么没有什么办法,但我不明白为什么要这么做。有关问题域的更多详细信息,我可能会提供帮助。谢谢。为什么我没有想到这个简单的解决方案你认为哪个更好,你的解决方案还是111111的?哪个更快?@user1243815两者速度相同。His使用积分常数4来增加指针。我使用编译时常量sizeof(int)。我对int的大小没有这样的假设,所以它更便于携带。这是唯一的区别。@user1243815 Oh和他的使用reinterpret_cast更清楚地表达了这种类型的X射线代码的危险性。这是他的道具。他还使用int32_t,它保证所有平台上的32位Int。我只使用int,但我使用sizeof(int)来确保它在不考虑大小的情况下工作。
#include <cstdint>

unsigned char *p = new unsigned char[8];
int32_t *x1=reinterpret_cast<int*>(p);
int32_t *x2=reinterpret_cast<int*>(p+4);
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;