所有这一切都源于我在尝试以下行时戳编译器警告消息(C4267):
const unsigned int nSize = m_vecSomeVec.size();
size()
返回一个 size_t,虽然 typedef'd 为 unsigned int,但实际上不是 unsigned int。我认为这与 64 位可移植性问题有关,但是有人可以为我解释一下吗?(我不只是想禁用 64 位警告。)
所有这一切都源于我在尝试以下行时戳编译器警告消息(C4267):
const unsigned int nSize = m_vecSomeVec.size();
size()
返回一个 size_t,虽然 typedef'd 为 unsigned int,但实际上不是 unsigned int。我认为这与 64 位可移植性问题有关,但是有人可以为我解释一下吗?(我不只是想禁用 64 位警告。)
这取决于实施。std::size_t
例如具有最小所需大小。但是没有上限。为避免此类情况,请始终使用正确的 typedef:
const std::vector<T>::size_type nSize = m_vecSomeVec.size();
那时你将永远安全。
当为 64 位平台编译时,size_t
将是 64 位类型。因此,Visual Studio 会在启用“检测 64 位可移植性问题”时发出有关将size_t
s分配给 s 的警告。int
size_t
Visual C++通过__w64
令牌获取这些信息,例如__w64 unsigned int
.
有关 64 位移植问题的更多信息,请参阅以下链接。 http://www.viva64.com/en/a/0065/
如果size_t
是 typedef:ed to unsigned int
,那么它当然是unsigned int
, 在您的特定平台上。但是它是抽象的,所以你不能依赖它总是一个unsigned int
,它可能在其他平台上更大。
可能它没有被做得更大,因为这样做会花费太多,例如,其中包含超过 2^32 个项目的向量并不常见。
根据编译器的不同,int
在 64 位域中可能是 32 位。