gpt4 book ai didi

c - 在 C 中维护指向两个相关类型的指针数组

转载 作者:太空宇宙 更新时间:2023-11-04 05:38:54 25 4
gpt4 key购买 nike

我的结构如下

struct things
{
BOOL_T is_copy; /* is false */
handle1 h1;
handle2 h2;
int n;
void * memory;
};

有时我会在下面的结构中复制things的对象

struct copy_of_things
{
BOOL_T is_copy; /* is true */
handle1 h1; /* I don't need h2 and n here */
void * memory; /* copied from things object and
things object allocates new memory */
int another_member;
};

此外,我在管理器中有一个结构数组,它保留所有 thingscopy_of_things 结构存在于我的程序中(称之为 struct things *things_array[ SIZE_OF_ARRAY];).由于设计要求,我无法管理 2 个数组(数组类似于散列)。为了实现这一点,我将此数组的类型设为 thing * 并更改了 copy_of_things 的类型,如下所示

struct copy_of_things
{
struct things ths;
int another_member;
};

现在我可以读取数组元素的 is_copy 成员,并决定是将其解释为 things 还是 copy_of_things

我觉得这不仅在内存方面低效,而且看起来丑陋

解决方案 2我还计划使用数组类型是 struct of type(is_copy) and a union

struct things {
BOOL_T is_copy;
union {
struct { /* is_copy = false */
handle1 h1;
handle2 h2;
int n;
void * memory;
} t;
struct { /* is_copy = true */
handle1 h1;
void * memory;
int another_member;
} c;
};

但在审查时我发现这个设计也很丑。

解决方案 3 我计划将 BOOL_T is_copy; 保留为两个结构的第一个成员,并保留 BOOL_T 类型的数组。阅读完 BOOL_T 的内容后,我可以解除对事物或 copy_of_things 指针的引用。我不确定这是否是一个好的解决方案并提供明确定义的行为(在更高的优化级别),因为相同的地址被解释为不同的类型。

问题对于我的问题,是否有更好的解决方案可以在任何平台上移植。

编辑
感谢您的回答。因此,有两个建议的替代方案。

  1. 使用 union :该方法的缺点是,它需要更多的内存用于副本。在我的例子中,sizeof copy_of_things 明显小于 sizeof things。一种解决方法是分配实际对象可以驻留的足够字节。
  2. 使用通用结构并使其成为 copy_of_thingsthings 的第一个成员。在这里,我将最终取消引用具有 2 种类型的相同内存位置(struct common 和 struct things 或 struct copy_of_things)。我不确定 strict aliasing rule不会咬我。
  3. 另一个解决方案是将两个结构的第一个成员保留为 char is_copy;/*\0 如果不是副本,否则非零 并且仅作为 char *things *copy_of_things * 访问指针>.

悬而未决的问题
我看到很多地方都使用了解决方案 2。 严格的别名规则安全吗?是否有更好的解决方案来解决我的问题,因为代码会在各种编译器上编译。反向映射数组的大小很大,所以我避免使用 union 或增加反向映射大小的解决方案。事物(和副本)的数量较少,因此可以在那里添加新的数据成员。

最佳答案

您可以使用更紧凑的 union 共享这些结构的一些成员:

struct things {
BOOL_T is_copy;
handle1 h1;
void * memory;
union {
struct { /* is_copy = false */
handle2 h2;
int n;
} t;
struct { /* is_copy = true */
int another_member;
} c;
};

关于c - 在 C 中维护指向两个相关类型的指针数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24951236/

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