gpt4 book ai didi

c - 在一个 block 中为不同类型分配内存

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

我有一个关于 C 中动态内存分配的问题。我目前正在使用 C 语言实现人工神经网络。我找到了名为 genann 的现有项目我注意到一种我不熟悉的内存分配方法。

考虑一个结构:

typedef struct
{
int an, bn;
double *a, *b
} foo;

还有一个初始化函数:

foo *foo_init(int an, int bn)
{
foo *f;

f = malloc(sizeof(*f));
f->an = an;
f->bn = bn;

f->a = malloc(an*sizeof(*f->a));
f->b = malloc(bn*sizeof(*f->b));

return f;
}

这里有一个与上述项目不同的初始化函数:

foo *foo_init(int an, int bn)
{
foo *f;

f = malloc(sizeof(*f) + an*sizeof(*f->a) + bn*sizeof(*f->b));
f->an = an;
f->bn = bn;

f->a = (double*)((char*)f + sizeof(*f)); // Could be f->a = (double*)(f + 1); ?
f->b = f->a + an;

return f;
}

所以我在想这两种方法之间有什么区别。我能想到的第二种方法的唯一优点是我只需要分配和释放一个内存块,但由于它只是一个可能只调用一次的 init 函数,因此性能差异应该是微不足道的。另一方面,不同类型的指针指向同一个内存块,但我认为这并不违反严格的别名规则,因为它们指向 block 内的不同内存(?)。调整大小可能很困难,因为它不能像第一个 init 函数那样使用简单的 realloc 来完成。例如,如果我想将 a 和 b 缩小一并重新分配整个内存块,最后两个 b 值将丢失(而不是一个 a,一个 b)。

我的结论是以第一种方式分配内存更好,因为第二种方式几乎只有缺点。初始化函数之一是不好的做法吗?我是否遗漏了什么,这会使第二个功能更好?也许他们在项目中使用第二个是有特殊原因的?

提前致谢。

最佳答案

如果您分配并释放大量这些结构,节省的费用加起来可能会非常可观。

它使用较少的空间,因为每个分配的 block 都有一些记录其大小的簿记。它还可以减少内存碎片。

另外,这样做可以确保 ab 数组在内存中靠得很近。如果它们经常一起使用,这可以提高缓存命中率。

库实现者经常进行这些微优化,因为他们无法预测库将如何使用,并且他们希望在所有情况下都尽可能地工作。当您编写自己的应用程序时,您可以更好地了解哪些代码将处于对性能调整很重要的内部循环中。

关于c - 在一个 block 中为不同类型分配内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50514300/

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