C 语言中动态结构的内存分配

Memory allocation for dynamic structs in C

提问人:04Khey 提问时间:3/16/2023 更新时间:3/16/2023 访问量:75

问:

假设我有一个结构

struct GRAPH {
 NODE* nodes[];
}

具有节点的动态大小[]。我也有

struct NODE {
 char filename[40];
 struct NODE* links[];
}

我将知道运行时需要多少个链接和节点,并可以计算出所需的总空间。 我知道运行 malloc() 在运行时成本很高,所以对 nodes[] 执行 malloc(),然后为每个节点添加来自 malloc() 的指针会很糟糕。

我假设我将不得不调用 malloc() 来获取 GRAPH 的总大小,然后使用 char*(1 字节)手动处理来自该空间的指针并保存偏移量。我是否需要在每个链接[]的末尾分配和处理空终止符(即使用更大大小的calloc())?有没有更好的方法来解决这个问题?

c struct malloc 可变长度数组

评论

1赞 ShadowRanger 3/16/2023
“我知道运行 malloc() 在运行时成本很高,所以对节点执行 malloc(),然后为每个节点添加来自 malloc() 的指针会很糟糕。”在 99.99% 的代码不关心的极高性能场景中,这是很糟糕的。只需根据需要使用,并且仅在性能不可接受时才考虑批量分配。试图在太慢的情况下重新实现你自己的分配器(这就是这需要的),这是过早优化的定义,这是万恶之源。无论如何,我们没有足够的细节来回答。mallocmallocmalloc
0赞 pm100 3/16/2023
现代 mallocs 速度极快。现代编译器非常擅长优化处理指针的代码。
1赞 Nicholas Hayashi 3/16/2023
@pm100你是否考虑 malloc fast 取决于平台、你要求的大小,以及你是否关心平均时间、最坏情况、最佳情况等。在一些实时应用程序(如游戏)中,很少进行运行时分配。
0赞 Nicholas Hayashi 3/16/2023
不过,我大体上同意上述评论者的观点,我们需要更多关于您的问题的上下文来建议实际的正确解决方案,并且只是根据需要对内存进行恶意定位可能就可以了。当你说“char*(1 字节)”时,你的意思是 char 是 1 字节吗?char* 将是平台上指针的大小,可能是 4 或 8,而不是 1。无论哪种情况,如果您提前知道每个节点将有多少个“链接”,则在数组末尾不需要“空终止符”。如果您事先不知道,更常见的做法是显式存储“计数”。

答:

1赞 confusedandsad 3/16/2023 #1

你可以按照你描述的去做,但使用 malloc 本身并不是坏事。事实上,这在绝大多数时候都不是问题。根据您的平台以及您的代码将如何处理图形,malloc 不太可能成为代码中的性能瓶颈。

例如,在 HPC 环境中,假设分配一个大图形需要几分之一秒,那么您可以轻松地花费 1000 倍的时间实际执行代码设计要执行的任何操作。 这可能是您应该优化的。

话虽如此,如果你选择创建自己的分配器,你可以像你说的那样使用空终止符,或者如果你知道你需要多少个结构,你可以准确地分配你需要的东西。