gpt4 book ai didi

c - 灵活的数组成员真的有必要吗?

转载 作者:太空狗 更新时间:2023-10-29 16:39:59 24 4
gpt4 key购买 nike

显然,具有灵活数组成员的结构不打算声明,而是与指向该结构的指针一起使用。声明灵活数组成员时,必须至少有一个其他成员,并且灵活数组成员必须是该结构中的最后一个成员。

假设我有一个看起来像这样的:

struct example{
int n;
int flm[];
}

然后要使用它,我必须声明一个指针并使用 malloc 为结构的内容保留内存。

struct example *ptr = malloc(sizeof(struct example) + 5*sizeof(int)); 

也就是说,如果我希望我的 flm[] 数组包含五个整数。然后,我可以使用我的结构像这样:

ptr->flm[0] = 1; 

我的问题是,我不应该只使用指针而不是这个吗?它不仅与 C99 之前的版本兼容,而且我可以在有或没有指向该结构的指针的情况下使用它。考虑到我已经必须将 malloc 与 flm 一起使用,难道我不能这样做吗?

考虑示例结构的这个新定义;

struct example{
int n;
int *notflm;
}

struct example test = {4, malloc(sizeof(int) * 5)};

我什至可以像灵活数组成员一样使用替换:

这也行吗? (上面提供了用notflm定义的例子)

struct example test; 
test.n = 4;
notflm = malloc(sizeof(int) * 5);

最佳答案

指针不是数组。选择使用哪个的基本原因与数组与指针的选择相同。在灵活数组成员的特殊情况下,以下是您可能更喜欢它们而不是指针的一些原因:

  • 减少存储要求。指针会将您的结构扩大(通常)4 或 8 个字节,如果您单独分配指向的存储而不是单独调用 malloc,您将花费更多的开销。

  • 提高访问效率。灵活的数组成员位于与结构基址的恒定偏移处。指针需要单独的取消引用。这会影响访问它所需的指令数量和注册压力。

  • 分配成功/失败的原子性。如果您分配结构并为其分配存储以作为两个单独的步骤指向,那么您在失败情况下进行清理的代码将更加丑陋,因为您遇到了一个成功而另一个失败的情况。这可以通过一些指针算法从同一个 malloc 请求中分离出来来避免,但是由于对齐问题很容易导致逻辑错误并调用 UB。

  • 避免深拷贝的需要。如果您使用灵活数组而不是指针,则可以简单地使用 memcpy(不分配,因为分配不知道灵活数组长度)来复制结构,而不必也复制指向的数据并修复指针在新副本中。

  • 避免深度自由的需要。能够free 单个对象而不是必须free 指向的数据是非常方便和干净的。当然,这也可以通过上面提到的“分割单个 malloc”方法来实现,但是灵活的数组使它更容易且更不容易出错。

  • 当然还有更多原因......

关于c - 灵活的数组成员真的有必要吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18001710/

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