2008-12-04 99 views
1

這一切都源於我在編譯器警告消息(C4267)戳嘗試下面一行時:64位可移植性問題

const unsigned int nSize = m_vecSomeVec.size(); 

size()返回這雖然typedef定義到unsigned int的一個爲size_t,實際上不是一個unsigned int。我相信這與64位可移植性問題有關,但是有人可以解釋它對我更好一些嗎? (我不只是想禁用64位警告。)

+0

SO你爲什麼不用nSize的size_t? C++非常敏感/嚴格(按設計)。所以總是使用正確的類型。 – 2008-12-04 18:05:49

回答

8

這取決於實施。例如,std::size_t具有最小的所需尺寸。但沒有上限。爲避免這些情況,請始終使用適當的typedef:

const std::vector<T>::size_type nSize = m_vecSomeVec.size(); 

您將始終保持安全。

+0

True - size_t對於矢量可能不夠大。 – MSalters 2008-12-05 12:24:15

2

如果size_t是typedef:編輯爲unsigned int,那麼當然這是一個unsigned int,在您的特定平臺上。但它是抽象的,所以你不能依賴它總是是一個unsigned int,它可能在其他平臺上更大。

可能它並沒有做得更大,因爲這樣做會花費太多,其中超過2^32項目的向量不是很常見。

3

編譯爲64位平臺時,size_t將是64位類型。因此,當啓用「檢測64位可移植性問題」時,Visual Studio會給出關於將size_t s分配給int的警告。

Visual C++通過__w64令牌獲取關於size_t的此信息,例如, __w64 unsigned int

參見下面的鏈接以獲得更多關於64位移植問題.. http://www.viva64.com/en/a/0065/

1

根據編譯器,int可以是在64位的地32位。