gpt4 book ai didi

c++ - 在无类型内存空间中存储多类型数据

转载 作者:行者123 更新时间:2023-11-30 04:29:14 24 4
gpt4 key购买 nike

在下面的代码示例中,如何使 *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;

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

最佳答案

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

Some reading to get you started ,但你应该阅读更多内容,包括用户定义类型的对齐,以及你所针对的各种编译器和操作系统,如果你真的想按照你正在做的方式而不使用更结构化的方法(例如:Variant结合静态和动态多态性的类型方法)。

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

您需要知道哪些类型需要与哪些边界对齐(字节、字、双字、四字)。它也各不相同。例如,您不一定能存储未在字边界上对齐的 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;

关于c++ - 在无类型内存空间中存储多类型数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9526226/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com