2013-08-22 22 views
7

我知道sizeof如何計算僅包含數據成員的結構的大小。但是,例如,如果我有C++在C++中具有函數的結構的大小

struct MyAdd() 
{ 
    int AddInt() 
    { 
     int a=5; 
     int b=5; 
     return a+b; 
    } 
    int c; 
    int d; 
}; 

所以下面的結構上使用sizeof功能也返回的內部函數AddInt聲明的變量的大小還是會只考慮成員變量(cd)?

+0

你爲什麼不嘗試運行代碼? – nommyravian

+3

'sizeof'不是一個函數,它是一個運算符。 –

回答

18

它只會考慮成員變量。

此外,非虛擬成員函數不會影響struct的大小,因爲它們不會要求任何運行時支持。

要理解爲什麼它是如此,可想而知,但從編譯點這段代碼是非常相似的僞代碼:

struct MyAdd 
{ 
    int c; 
    int d; 
}; 

int MyAdd_AddInt(MyAdd* this) 
{ 
    ... 
} 
+0

非虛擬成員函數_usually_不貢獻... - 沒有規則說他們沒有貢獻。 – MSalters

+0

@ MSalters:的確如此。但是,你知道任何編譯器會使它們對實例大小有貢獻嗎? –

2

的功能(包括函數中的變量)的代碼部分都沒有數作爲任何數據項的大小的一部分。

如果結構具有虛擬功能,那麼可能會增加結構的大小。

編譯器還可以在數據元素之間添加填充以支持數據結構中成員的正確對齊。

換句話說,sizeof可能會產生比單個元素更大的尺寸。但是任何成員函數都不會被計入這個大小。

2

sizeof將計算該類型實例的佔用內存大小。對於結構/類實例,函數不會爲每個實例佔用額外的內存(存儲在文本段中),而每個實例的數據成員將不同並且需要獨立的內存(存儲在rw數據段中)。