将多类型数据存储在非类型化存储器空间中
storing multi-type data in untyped memory space
在下面的代码示例中,如何使*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);
也就是说,请你确切地告诉我们你在更大范围内试图做什么——几乎肯定有更好的方法。
还请使用特定大小的类型,这种类型的编程充满了痛苦。
相关文章:
- 不能对类型化模板使用 STL 函数
- 为什么必须在C++中显式类型化 malloc 和 calloc?
- 删除非类型化shared_ptr
- 将自动类型化 lambda 与模板化函数一起使用 - 在 g++ 5.4 中使用自动模板推导
- 如何进行模板化类型化参数专用化?
- 为什么使用类型化的 8 位常量而不是等效的 #define "Impossible constraint"?
- 将类型化数组写入子进程 stdin 无法正常工作
- 带有类型化参数的模板模板参数?
- 当类型为参数时如何避免类型化
- 将C#结构的存储器大小与C 结构匹配
- 具有已定义操作重载的 C++ 非类型化值对象/变量库
- 如何将图像数据从搜索窗口中移动到本地存储器OpenCL
- 将指向类型化/大小的枚举的指针转换为指向基础类型的指针是否安全?
- 如何创建类型化函数的函数指针数组
- 如何在以下C程序中计算运行时间内存和最大数据存储器使用情况
- 使用c中的结构的malloc通过大量存储器进行索引
- 请求在C和C 中存储器的缓存
- C .何时删除C风格数组以自由存储器
- 如何使用System()函数[C ]将CMD存储器存储在C 中
- 将多类型数据存储在非类型化存储器空间中