56

sizeof 演算子の戻り値の型は何ですか? cppreference.com & msdn は sizeof が size_t を返すと言います。本当に size_t を返しますか? 私は VS2010 Professional を使用しており、x64 をターゲットにしています。

int main()
{
    int size   = sizeof(int);     // No warning
    int length = strlen("Expo");  //warning C4267: 'initializing' : conversion from 'size_t' to 'int', possible loss of data
    return 0;
}

この質問があるのは、最初の行では警告が発行されていないのに対し、2 行目では警告が発行されているためです。char サイズに変更しても、警告は表示されません。

4

3 に答える 3

33

C++11、§5.3.3 ¶6

sizeofandの結果はsizeof...型の定数ですstd::size_t。[ 注: std::size_t は標準ヘッダー (18.2) で定義されています。— エンドノート]

簡単なチェックを行うこともできます:

#include <iostream>
#include <typeinfo>
#include <cstdlib>

int main()
{
    std::cout<<(typeid(sizeof(int))==typeid(std::size_t))<<std::endl;
    return 0;
}

1私のマシンで正しく出力されます。

@Adam D. Ruppeがコメントで言ったように、おそらくコンパイラは結果を知っているので、そのような「変換」が危険ではないことを知っているので、文句を言わないでしょう。

于 2013-11-08T23:17:31.640 に答える
9

size_t は、実装定義の符号なし整数型の別名です。sizeof 演算子が VLA 配列に適用される可能性がある C とは反対の C++ では、sizeof 演算子のオペランドは (実行時に) 評価されません。定数です。sizeof 演算子の値が int 型に収まる場合、コンパイラは警告を発行しません。2 番目の例では、 std::strlen が実行時に評価されるため、その結果が int に収まらない可能性があるため、コンパイラは警告を発行します。std:;strlen を独自の constexpr 関数 (再帰関数) に置き換えることができます。この場合、結果が int に収まる場合、コンパイラは警告を発行しないと思います。

于 2013-11-08T23:29:25.557 に答える
3

sizeof 演算子は、型または変数のサイズをバイト単位で取得するために使用されます。16 ビット以上の符号なし整数型を返します。携帯性を確保するために使用しています。

この警告は、size_t が定義されている符号なし整数によるものです。

于 2013-11-08T23:28:26.297 に答える