64位可移植性问题

问题描述:

这一切都源于我在编译器警告消息(C4267)戳尝试下面一行时:64位可移植性问题

const unsigned int nSize = m_vecSomeVec.size(); 

size()返回这虽然typedef定义到unsigned int的一个为size_t,实际上不是一个unsigned int。我相信这与64位可移植性问题有关,但是有人可以解释它对我更好一些吗? (我不只是想禁用64位警告。)

+0

SO你为什么不用nSize的size_t? C++非常敏感/严格(按设计)。所以总是使用正确的类型。 – 2008-12-04 18:05:49

这取决于实施。例如,std::size_t具有最小的所需尺寸。但没有上限。为避免这些情况,请始终使用适当的typedef:

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

您将始终保持安全。

+0

True - size_t对于矢量可能不够大。 – MSalters 2008-12-05 12:24:15

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

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

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

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

参见下面的链接以获得更多关于64位移植问题.. http://www.viva64.com/en/a/0065/

根据编译器,int可以是在64位的地32位。