2017-11-15 21 views
0

std::vector::resizeメンバ関数は次のようである:64ビットプラットフォームでsize_typeが32ビット整数になるのはなぜですか?

ボイドサイズ変更(size_type n)が、私の理解パー

size_type64-bitプラットフォーム上64-bit longタイプでなければなりません。

#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); 

のでsize_type32-bit int我々は64-bitプラットフォーム上で作業しているにもかかわらず、まだですが、次のプログラムをコンパイルしますか?

+4

ベクトルの 'size_type'は、符号なしである必要はありません。 – StoryTeller

+0

[this](https://stackoverflow.com/questions/4849632/vectorintsize-type-in​​-c)と[this](http://en.cppreference.com/w/cpp/types/)をご覧ください。 size_t)。 – hnefatl

+3

ここでINT_MAX +1がUBを呼び出しました。 – rsp

答えて

3

ベクターのsize_typeはおそらくallocator::size_tのtypedefであり、おそらくは符号なしタイプのstd::size_tのtypedefです。生成された警告は、ベクターのresize()署名とは関係ありません。最大整数制限がオーバーフローし、INT_MAX + 1式がundefined behaviourを呼び出します。また、forループは、iの型をintと推定します。これは、符号付き値と符号なし値を比較するときにも警告を発します。あなたは本当にあなたにしたい場合はsize_typeにキャストし、1を追加することができます。

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

forループ内の初期値にuリテラルを追加します。

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

あなたがして基になる型の名前を取得できます。

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

したがって、最も正しい書式は 'for(ベクトル :: size_type i = 0; i

関連する問題