2011-02-28 192 views
3

以下是关于C编程的问题。我正在使用Microchip C30编译器(因为我知道有人会问)包含结构的结构与包含指针的结构

让一个包含其他结构的结构与包含几个指向其他结构的结构之间的区别是什么?是否有人比其他人更快地执行代码?一种技术是使用更多还是更少的内存?在这两种情况下,内存是否同时分配?

如果我使用下面的代码,内存是否自动为subStruct分配?

// 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) 
{ 
    //... 
{ 

回答

2

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

你需要什么取决于你的使用情况:

  • 指针会给你小struct
  • 子结构提供更好的参考局部性
  • 指针可以指向一个单一的struct或第一个成员在他们的数组中,而子结构是自我记录的:除非明确使用数组,否则总是有一个成员
  • 指针占用一些空间,指针本身+额外的内存分配

不,这不要紧,你用:)

2

指针的内存没有被自动分配,但是当你在你的结构中包含整个结构时,它会这样做。

另外 - 有了指针,你可能会有碎片化的内存 - 每个结构的尖端部分可能在内存的其他部分。

但是有了poniters,你可以在许多结构中共享相同的子结构(但是这会使得更改和删除它们更困难)。

0

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

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

就性能而言,通过指针从一个结构到另一个结构可能会有小的打击。

0

哪个编译至于速度推移,它变化。通常,包括结构体而不是指针会更快,因为CPU不必为每个成员访问取消引用指针。但是,如果某些成员不常使用,并且子结构的大小很大,则结构可能不适合缓存,这会使代码变慢。

使用指针将使用/略/更多的内存(但只有指针本身的大小)比直接的方法。

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

0

是什么

具有包含多个其他结构VS其中包含几个指向其他结构的结构的结构之间的区别吗?在第一种情况下,你有什么本质上是在连续的内存中的一个大的结构。在“结构指针”的情况下,您的主结构只包含子结构w的地址这些分开分配。

是否有人比其他人更快地执行代码?

区别应该可以忽略不计,但指针方法会稍微慢一些。这是因为您必须对每个对子结构的访问取消引用指针。

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

指针方法使用number_of_pointers * sizeof(void*)更多内存。 sizeof(void*)将针对32位为4,针对64位为8。

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

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

结论

指针增加一个层间接的转码,它是用于切换出所述子结构或具有多于一个指针指向相同的子结构是有用的。让不同的主结构指向特定的子结构可以节省相当多的内存和分配时间。