C 包含结构的结构与包含指针的结构

C 包含结构的结构与包含指针的结构,c,memory-management,structure,C,Memory Management,Structure,以下问题与C编程有关。我正在使用微芯片C30编译器(因为我知道有人会问) 一个包含多个其他结构的结构与一个包含多个指向其他结构的指针的结构之间有什么区别?其中一个比另一个有利于更快的代码执行吗?一种技术使用更多还是更少的内存?在这两种情况下是否同时分配内存 如果我使用下面的代码,内存会自动分配给子结构吗 // Header file... typedef struct{ int a; subStruct * b; } mainStruct; typedef struct{

以下问题与C编程有关。我正在使用微芯片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)
{
   //...
{

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

此外,使用指针,您可能会有碎片化的内存,结构的每个指向部分都可能位于内存的另一部分


但是使用Poniter,您可以在许多结构中共享相同的子结构(但这会使以后更难更改和删除它们)。

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

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

就性能而言,通过指针从一个结构切换到另一个结构可能会有小的影响。

如果使用指针,则必须自己分配内存。如果使用子结构,可以使用
malloc
或在堆栈上一次性分配整个内容

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

  • 指针将为您提供更小的
    struct
  • 子结构提供了更好的参考位置
  • 指针可以指向单个
    结构
    ,也可以指向它们数组中的第一个成员,而子结构是自文档化的:除非显式使用数组,否则它们中总会有一个
  • 指针会占用一些空间,因为指针本身+额外内存分配的开销

不,不管你使用哪种编译器:)

就速度而言,它是不同的。通常,包含结构而不是指针会更快,因为CPU不必对每个成员访问都取消引用指针。但是,如果某些成员不经常使用,并且子结构的大小很大,则该结构可能不适合缓存,这会大大降低代码的速度

与直接方法相比,使用指针将使用/稍微/更多的内存(但仅限于指针本身的大小)


通常,通过指向子结构的指针,您将分别分配子结构,但您可以编写某种初始化函数,将所有分配抽象为“同一时间”。在代码中,内存分配给堆栈上的
myMainStruct
,但
b
成员将是垃圾。您需要调用
malloc
b
分配堆内存,或者在堆栈上创建一个
subStruct
对象,并将
mymainstuct.b
指向它。

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

在第一种情况下,您拥有的基本上是连续内存中的一个大结构。在“指向结构的指针”的情况下,主结构只包含子结构的地址,这些子结构是单独分配的

其中一个是否比另一个更快地执行代码?

差异应该可以忽略不计,但指针方法的速度会稍慢一些。这是因为必须在每次访问子结构时取消对指针的引用

一种技术使用的内存是多还是少?

指针方法使用
指针数量*sizeof(void*)
更多内存
sizeof(void*)
对于32位为4,对于64位为8

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

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

结论

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