行爲

2011-03-04 49 views
6

如果我定義一個結構,如:行爲

struct tiny 
{ 
    long t; 
}; 

將它像一個long中的函數參數和相似, 例如在術語處理會的參數:

void myfunc(tiny x) 
{ ... } 

被像一個long參數處理實際上被推入棧?

因此,基本上,tiny結構只有它的唯一成員?

感謝

回答

7

結構的內存消耗至少是組成變量的內存大小的總和。

但是,編譯器可以在變量之間或在該結構的末尾添加填充,以確保正確的數據對齊對於給定的計算機體系結構

+1

標準對符合特定標準,被稱爲莢類的特別規定,以保持Ç兼容性。除此之外,這些類型不會被填充。在這種情況下,'tiny'結構符合這些標準。 – 2011-03-04 17:30:36

+3

@dauphic不,類/結構可以是POD,仍然有填充。 – 2011-03-04 17:33:12

+2

@dauphic:POD可以有填充,只是不在開始。見2003年的9.2/17。 – 2011-03-04 17:35:11

7

有沒有它的保證,但至少在我看了它,它一般會是的,是的編譯器。

-1

如果開始添加虛擬功能,它將由4個字節上最增加系統/編譯器(每個接口包含額外的4個字節)。一般來說,除非編譯器已經像Av​​iv所說的那樣添加了額外的填充,否則結構應該與內容大小相同。

看一看的#pragma包(n)的包裝問題,至少在Visual Studio(Microsoft page on pragma pack

+0

-1我沒有在OP的代碼中看到任何虛函數。他在問一個「微小」的結構;實際上,他指的是POD,雖然他還不知道。出於任何原因,該類型的寬度至少可以與其成員寬度的總和相同。 '#pragma'是非標準的。 – 2011-03-04 17:35:50

+0

我只是說這是當它不是POD時它會開始變大。這就是爲什麼我說'如果'。不需要標記我。 – Luther 2011-03-04 17:38:42

+0

即使是POD,它也可以變大。這就是爲什麼我標記你。 – 2011-03-04 19:13:09