2012-10-10 71 views
3

考慮:sizeof(value)vs sizeof(type)?

double data; 
double array[10]; 
std::vector<int> vec(4, 100); 
MyClass myclass; 

有沒有之間的差異:

sizeof(double); 
sizeof(double[10]); 
sizeof(std::vector<int>); 
sizeof(MyClass); 

sizeof(data); 
sizeof(array); 
sizeof(vec); 
sizeof(myclass); 

是兩種語法不同或完全等同?他們是否都在編譯時進行評估?如果不是,哪一個在運行時被評估?

+2

類型的大小在運行時不能改變。 'sizeof'總是在編譯時產生它的值。 – Xeo

+2

你試過了嗎? –

+0

因爲你在問C++,所以不太相關;但是,就我所知,'sizeof'在運行時唯一的時間是在C中,可變長度數組。但是這些在C++中是不合法的,儘管它們可以用GCC作爲擴展。 –

回答

15

唯一的區別是語法和方便。

在語法上,你被允許在一種情況下離開了括號,而不是其他:

double d; 

sizeof(double); // compiles 
sizeof(d);  // compiles 
sizeof d;  // compiles 
sizeof double; // does NOT compile 

至於方便去考慮是這樣的:

float a; 

x = sizeof(float); 

y = sizeof(a); 

如果,例如,您有時最終將afloat更改爲雙倍,您還需要將sizeof(float)更改爲sizeof(double)以匹配。如果您始終使用sizeof(a),那麼當您將afloat更改爲double時,您所有用於sizeof的用途也將自動更改,無需任何編輯。後者是更經常在溫度比C++,這樣一個問題調用malloc時爲:

float *a = malloc(10 * sizeof(float)); 

float *a = malloc(10 * sizeof(*a)); 

在第一種情況,改變第一floatdouble將產生編譯代碼,但有一個緩衝區溢出。在第二種情況下,將(僅)float更改爲double可以正常工作。

+0

注意到Linux內核代碼準則涵蓋了這一點,建議使用sizeof(*變量)來確定指向結構體的指針的結構大小,這也很好。如果最終出現這種情況,這可能是一個好主意(儘管在C++中它應該很少見)。 –

2

後者是根據前者定義的。給定一個表達式,它將返回表達式類型的大小。所以sizeof(vec)轉換爲sizeof(std::vector<int>)

兩者都在編譯時進行評估;唯一的運行時間是sizeof是C而不是C++,帶有可變長度數組。 sizeof的操作數未被評估,所以沒有任何實際的表達本身可以生成代碼。

我更喜歡在類型上使用表達式,因爲機會是說某種形式的類型是多餘的。

+0

我更喜歡錶達。因爲他們讓女性更容易。如果你改變一個變量的類型,你只需要在一個地方改變它,而不是追蹤類型的使用方式(即在sizeof()中)。 –

+0

@LokiAstari:是的,它在概念上更好地匹配:爲什麼要推斷出類型和大小?我們希望表達式的大小如此輸入! – GManNickG

1

無論何時使用sizeof(<whatever>),它總是在編譯時進行評估。它是sizeof所關心的參數的數據類型。

但是,您可以傳遞值,甚至表達式作爲參數。但sizeof函數只會考慮傳遞參數的dataype。

您還可以將表達式作爲sizeof(x = x+1);傳遞。說x是int。在這種情況下,這個sizeof將返回4(與我的機器一樣)並且x的值將保持不變。這是因爲sizeof總是在編譯時進行評估。

您提供的兩組語法將返回相同的結果,但不能說它們是等效的。但是,後者是根據前者定義的。

相關問題