所有这些都源于我在尝试以下一行时捅了编译器警告消息(C4267):
const unsigned int nSize = m_vecSomeVec.size();
size()
返回size_t,尽管typedef为unsigned int,但实际上并不是unsigned int。我认为这与64位可移植性问题有关,但有人可以为我解释一下吗? (我不只是想禁用64位警告。)
答案 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位。