所有这一切都源于我在尝试以下行时戳编译器警告消息(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_ts分配给 s 的警告。int
size_tVisual 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 位。