2009-09-13 172 views
0

有人可以爲我解釋下面的代碼片段嗎?C++中的Sizeof以及如何計算指針長度?

// Bind base object so we can compute offsets 
// currently only implemented for indexes. 
template<class DataObj> void BindAsBase(DataObj &rowbuf) 
{ 
    // Attempting to assign working_type first guarantees exception safety. 
    working_type = DTL_TYPEID_NAME (rowbuf); 
    working_addr = reinterpret_cast<BYTE*>(&rowbuf); 
    working_size = sizeof(rowbuf); 
} 

我的問題是什麼是sizeof(rowbuf)的結果?它是DataObj的長度還是Byte *的長度?爲什麼?

另一個問題:爲什麼需要計算指針的偏移量?它通常使用什麼?

什麼是sizeof(working_addr)等於?

+0

這將有助於有更多的上下文。通常,您不使用C++中的reinterpret_cast和sizeof,而使用非標準的typeid函數。 這段代碼進入了什麼?這個信息用於什麼? – Potatoswatter 2009-09-13 15:16:04

回答

5

sizeof(rowbuf)返回DataObj類型的對象的長度(以字節爲單位)。 請注意,rowbuf是指針,但它是一個相當不同的參考。

如果要計算y DataObj指針的大小,請使用sizeof(& rowbuf)或sizeof(DataObj *)。

3

sizeof(rowBuf)是DataObj類型使用的字節數。它是在編譯時計算的。

通常需要在不知道對象的情況下調用給定實例上的方法(所謂的方法綁定就像在boost :: bind中一樣),這些綁定的實例方法可以用作算法的回調函數。

3

MSDN page about sizeof

當sizeof運算符應用於 基準,其結果是一樣的 如果的sizeof已經施加到 對象本身

所以的sizeof (rowbuf)== sizeof(DataObj)

1

rowbufDataObj &。所以你可以預期sizeof(rowbuf)等於sizeof(DataObj)

有一天,我瞭解了Visual Studio 調試器有一個錯誤sizeof和引用。它實際上會給你一個指針的大小而不是對象的大小。編譯器做正確的事情。