1

これはすべて、次の行を実行しようとしたときに、コンパイラの警告メッセージ (C4267) を突っ込んだことが原因です。

const unsigned int nSize = m_vecSomeVec.size();

size()unsigned int に typedef されていますが、実際には unsigned int ではない size_t を返します。これは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 ビット型になります。このため、 「64 ビットの移植性の問題を検出する」が有効になっている場合、Visual Studio はsize_ts への s の割り当てに関する警告を表示します。int

Visual C++ は、トークンsize_tを通じてこの情報を取得します。__w64__w64 unsigned int

64 ビットの移植に関する問題の詳細については、以下のリンクを参照してください。 http://www.viva64.com/en/a/0065/

于 2008-12-04T17:04:41.917 に答える
2

size_tが typedef:edの場合unsigned int、もちろんunsigned int、特定のプラットフォームでは です。ただし、それは抽象化されているため、常にであることに依存することはできませんunsigned int。他のプラットフォームではより大きくなる可能性があります。

おそらく、そうするとコストがかかりすぎるため、大きくはされていません。たとえば、2^32 を超えるアイテムを含むベクトルはあまり一般的ではありません。

于 2008-12-04T17:03:35.150 に答える
1

コンパイラによっては、int64ビットランドで32ビットになる場合があります。

于 2008-12-04T17:06:07.297 に答える