包含结构体的结构体 vs. 包含指针的结构体

3
以下问题涉及C编程。我正在使用Microchip C30编译器(因为我知道有人会问)
一个包含多个其他结构的结构体和一个包含多个指向其他结构体的指针的结构体之间有什么区别?哪种方式比另一种方式执行代码更快?哪种技术使用的内存更多或更少?在两种情况下,内存是否同时分配?
如果我使用以下代码,子结构的内存是否会自动分配?
// Header file...

typedef struct{
    int a;
    subStruct * b;
} mainStruct;

typedef struct{
    int c;
    int d;
}subStruct;

extern mainStruct myMainStruct;

// source file...
mainStruct myMainStruct;

int main(void)
{
   //...
{
5个回答

3
如果您使用指针,您必须自己分配内存。如果您使用子结构,可以一次性分配整个结构,可以使用malloc或堆栈来完成。

您需要的取决于您的用例:

  • 指针将为您提供更小的struct
  • 子结构提供更好的引用局部性
  • 指针可能指向单个struct或其中一个数组的第一个成员,而子结构是自说明的:除非显式使用数组,否则始终存在一个
  • 指针占用一些空间,包括指针本身+额外内存分配的开销

不过,无论您使用哪个编译器都没有关系 :)


2

指针的内存不会自动分配,但是当你在结构体中包含整个结构时,它会被自动分配。

此外,使用指针可能会导致内存碎片化——结构的每个指向部分可能位于内存的其他部分。

但是使用指针可以在许多结构体之间共享相同的子结构(但这会使以后更改和删除它们更加困难)。


0

指针的内存不会自动分配。您需要运行以下命令:

myMainStruct.b=malloc(sizeof(*myMainStruct.b));

就性能而言,通过指针从一个结构体转到另一个结构体可能会有一点影响。

0
就速度而言,它是不同的。通常情况下,包括结构体比指针更快,因为CPU不必为每个成员访问解引用指针。但是,如果某些成员很少使用,并且子结构的大小很大,则该结构可能无法适合缓存,这会使您的代码变慢。
使用指针将使用 /稍微/ 更多的内存(仅指指针本身的大小)比直接方法。
通常对于子结构的指针,您将单独分配子结构,但可以编写某种初始化函数,将所有分配抽象为“相同时间”。在您的代码中,为myMainStruct在堆栈上分配了内存,但b成员将是垃圾。您需要调用malloc为b分配堆内存,或者在堆栈上创建一个subStruct对象并指向myMainStruct.b。

0

一个包含多个结构体的结构体和一个包含多个指向其他结构体的指针的结构体有什么区别?

在第一种情况下,你拥有的是一个连续内存中的大结构体。而在“指向结构”的情况下,你的主结构体只包含对分配单独的子结构体的地址。

哪一种比另一种执行代码更快?

差异应该可以忽略不计,但指针方法会稍微慢一些。这是因为每次访问子结构体时必须解引用指针。

哪一种技术使用的内存更多或更少?

指针方法会使用number_of_pointers * sizeof(void*)更多的内存。sizeof(void*)在32位系统上为4,在64位系统上为8。

在两种情况下内存是否同时分配?

不同,你需要遍历主结构体中的每个指针,并通过malloc()为子结构体分配内存。

总结

指针为代码添加了一层间接性,这对于切换子结构或让多个指针指向同一个子结构非常有用。特别是当不同的主结构指向共同的子结构时,可以节省相当多的内存和分配时间。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接