c++ - 为什么 size_type 在 64 位平台上是 32 位整数?

标签 c++

std::vector::resize成员函数是这样的:

void resize (size_type n);

根据我的理解,size_type 应该是64 位 平台上的64 位长 类型。但是编译以下程序:

#include <iostream>
#include <climits>
#include <vector>

using namespace std;

vector<char> v;

int main() {
    // your code goes here
    v.resize(INT_MAX +1);
    for (auto i = 0; i < v.size(); i++ ) {
        cout << i << endl;
    }
    return 0;
}

生成以下警告:

g++ -std=c++11 hello.cpp
hello.cpp: In function ‘int main()’:
hello.cpp:11:19: warning: integer overflow in expression [-Woverflow]
  v.resize(INT_MAX +1);

那么即使我们在 64 位 平台上工作,size_type 仍然是 32 位 int

最佳答案

vector 的 size_type 可能是 allocator::size_t 的类型定义,它(可能)是 std::size_t 的类型定义。这是一个无符号类型。生成的警告与 vector 的 resize() 签名无关。您超出了最大整数限制并且您的 INT_MAX + 1 表达式调用了 undefined behaviour .此外,for 循环将 i 的类型推断为 int,这也会在比较有符号和无符号值时发出警告。如果你真的想要,你可以转换为 size_type 并添加 1:

v.resize(static_cast<std::vector<char>::size_type>(INT_MAX) + 1);

并将 u 文字附加到 for 循环内的初始值:

for (auto i = 0u; i < v.size(); i++)

您可以通过以下方式获取基础类型名称:

std::cout << typeid(std::vector<char>::size_type).name();

关于c++ - 为什么 size_type 在 64 位平台上是 32 位整数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47304364/

相关文章:

c++ - 使用基类指针确定子类的类型

类似 MPI 的 C++ 消息传递库

c++ - 在 C++ 中使用函数(void、double、int)

C++ 理解整数溢出

c++ - lldb - 如何为 cpp 文件中的所有函数设置断点

c++ - 如何创建<id, member function>的映射?

C++ 无法将成对的指针初始化为 NULL

c++ - 使用 sort 和 qsort 进行 c 风格的字符串排序

c++ - STATIC_ASSERTION_FAILURE 有什么作用?

c++ - 如何定义矩阵-矩阵乘法,使其也适用于 vectorXvector、vectorXmatrix 和 matrixXvector?