2010-06-20 66 views
-4

什麼會在下面的代碼空類和空函數的大小?

Class A{} 
void func(){} 

printf("%d,%d",sizeof(A),sizeof(func)); 
+0

PLZ給出同樣的原因 – 2010-06-20 11:33:19

+3

你自己試過了嗎?順便說一句,你可以編輯你自己的問題,所以不需要留言。 – Troubadour 2010-06-20 11:35:01

+2

這不是如何聲明一個類,爲什麼在C++中使用'printf',並且'sizeof'不能保證適合'%d'。 – 2010-06-20 11:36:06

回答

3

你正在服用哪些不能做一個函數的大小的解決方案。您需要在名稱前面加上&以獲取指向該函數的指針的大小。你還需要轉換sizeof值爲int類型,這是printf預計爲d

printf("%d,%d", (int)sizeof(A), (int)sizeof(&func)); 

至於具體的數值----這不知道他們是什麼超越是大於或等於1。這取決於編譯器。

0

通過sizeof(func),你大概的意思sizeof(&func),這是在字節的函數指針的大小。

至於什麼樣的A物體的大小,標準只是說:

類類型的完整的對象和成員子對象應具有非零大小。

其通過腳註94合格:

基類的子對象並不受限制。

的原因腳註是允許稱爲empty member optimization一個編譯器的優化,這是常用的模板庫中使用,而無需一個構件訪問類型的例程(例如一個分配器類類型的分配器例程)該類類型的對象。

+1

不同類型的指針不保證是相同的大小(雖然他們通常在實踐中) – 2010-06-20 14:11:55

+0

@Oli Charlesworth:哇,我沒有意識到指針大小可能不同,事實上,通過查看C和C++標準,我找不到任何強制兩個指針類型的大小相等的東西,然而,從[5.2.10 ]重新解釋轉換:「指向函數的指針可以顯式轉換爲指向不同類型函數的指針」,我認爲這意味着兩個* function *指針類型的大小至少是相同的。 – 2010-06-20 18:52:11

+1

數據指針和函數指針*的大小可能不同的一個例子是在具有哈佛架構(即單獨的指令和數據存儲器)的平臺上。 – 2010-06-20 20:07:30