2013-05-10 88 views
1

我無法找到有關sizeof行爲的信息(至少在gcc 4.6+中)。下面的代碼工作併產生「預期」結果(4,1,8),但我想知道爲什麼。我查了幾個問題,但沒有一個顯示這樣的例子。sizeof爲什麼返回類型

#include<iostream> 

int f1(int) { 
    return 0; 
} 

char f2(char) { 
    return 0; 
} 

double f3() { 
    return 0; 
} 

int main() { 
    std::cout << sizeof(f1(0)) << std::endl; 
    std::cout << sizeof(f2('0')) << std::endl; 
    std::cout << sizeof(f3()) << std::endl; 

    return 0; 
} 

答案將不勝感激。 謝謝。

回答

4

sizeof運算符可以將一個類型或表達式作爲參數並返回其參數的大小。你正在使用表達式,所以它返回這些表達式的大小。該表達式在運行時不進行評估 - 因此不會調用函數。但是正確的(重載)函數用於確定結果的大小。

在(現已刪除)評論,user1919074說:

sizeof(f1) would not work

腦屁

在C,sizeof(f1)會工作,因爲它會返回一個指針的大小的功能。

sizeof()運算符不能直接應用於函數名稱。它有特殊的規則,當應用於數組時,指針的正常「衰減」不會發生。類似地,使用sizeof()不會發生函數名稱更改爲函數指針。 (當然,你必須與-pedantic硬捅GCC得到它給予警告/錯誤;否則,返回1作爲函數的大小)

+0

這是正確的。我在http://en.cppreference.com/w/cpp/language/sizeof中找到了對行爲的描述。儘管如此,語法看起來很有趣,因爲函數當然不會被調用。謝謝。 – user1919074 2013-05-10 14:37:02

+0

嗯,不是真的。sizeof(f1)wiuld會產生一個錯誤,如「錯誤:ISO C++禁止將'sizeof'應用於函數類型的表達式[-fpermissive]」,正如本論壇的其他答案中所解釋的那樣 – user1919074 2013-05-10 14:46:03

+0

實際上這個引用是http:// en。 cppreference.com/w/cpp/language/sizeof明確指出'sizeof不能用於函數類型',它的確會產生上面提到的錯誤http://coliru.stacked-crooked.com/view?id=4bf2b300a7b6d97c11a73fdfad6908fa-81f8fd6fe3d78f519fccff6a9c88a3de – 2013-05-10 14:55:51

2

什麼的職能正在發生

int f1(int) { 
    return int(0); 
} 

char f1(char) { 
    return char(0); 
} 

double f1() { 
    return double(0); 
} 

以後會發生什麼。

std::cout << sizeof(int(0)) << std::endl; 
std::cout << sizeof(char('0')) << std::endl; 
std::cout << sizeof(double(0)) << std::endl; 

因爲正在打印的sizeof的是什麼value返回從功能

+0

我不認爲這是發生了什麼事。 「std :: cout << sizeof(double(U()))<< std :: endl;」其中U是某個班級出現錯誤。評估表達式(編譯時)並找到正確的函數。它不是'char('0'),它是'返回f1(char)'。 – user1919074 2013-05-10 15:04:30

0

F1返回一個整數,這需要4個字節。
f2返回一個需要1個字節的字符。
f3返回一個需要8個字節的double。

所以sizeof()所做的就是返回參數的大小。

1

ISO/IEC 14882在C++說(第5.3.3節 - 第79頁): 說

"The size operator shall not be applied to an expression that has function or incomplete type,..."

還要注意在啓用-pedantic選項編譯警告...

warning: invalid application of 'sizeof' to a function type 
相關問題