1

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

const unsigned int nSize = m_vecSomeVec.size();

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

4

4 回答 4

8

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

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

那时你将永远安全。

于 2008-12-04T17:15:58.620 回答
3

当为 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/

于 2008-12-04T17:04:41.917 回答
2

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

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

于 2008-12-04T17:03:35.150 回答
1

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

于 2008-12-04T17:06:07.297 回答