2011-02-28 238 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()爲子結構分配內存。

結論

指針增加一個層間接的轉碼,它是用於切換出所述子結構或具有多於一個指針指向相同的子結構是有用的。讓不同的主結構指向特定的子結構可以節省相當多的內存和分配時間。