64位可移植性问题

时间:2008-12-04 16:53:34

标签: visual-c++ 64-bit size-t

所有这些都源于我在尝试以下一行时捅了编译器警告消息(C4267):

const unsigned int nSize = m_vecSomeVec.size();

size()返回size_t,尽管typedef为unsigned int,但实际上并不是unsigned int。我认为这与64位可移植性问题有关,但有人可以为我解释一下吗? (我不只是想禁用64位警告。)

4 个答案:

答案 0 :(得分:8)

这取决于实施。例如,std::size_t具有最小的所需大小。但没有上限。要避免这种情况,请始终使用正确的typedef:

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

那么你将永远保持安全。

答案 1 :(得分:3)

编译64位平台时,size_t将是64位类型。因此,当启用“检测64位可移植性问题”时,Visual Studio会发出有关将size_t分配给int的警告。

Visual C ++通过size_t令牌获取有关__w64的此信息,例如__w64 unsigned int

有关64位移植问题的更多信息,请参阅以下链接。 http://www.viva64.com/en/a/0065/

答案 2 :(得分:2)

如果size_t是typedef:ed to unsigned int,那么当然它是unsigned int,位于您的特定平台上。但它是抽象的,所以你不能依赖它总是unsigned int,它可能在其他平台上更大。

可能它没有变得更大,因为这样做会花费太多,例如包含超过2 ^ 32个项目的向量并不常见。

答案 3 :(得分:1)

根据编译器的不同,int可能是64位的32位。