8

検討中:

double data; 
double array[10]; 
std::vector<int> vec(4, 100); 
MyClass myclass;   

間に違いはありますか:

sizeof(double);
sizeof(double[10]);
sizeof(std::vector<int>);
sizeof(MyClass);

sizeof(data);
sizeof(array);
sizeof(vec);
sizeof(myclass);

2つの構文は異なりますか、それとも厳密に同等ですか?それらはすべてコンパイル時に評価されますか?そうでない場合、実行時に評価されるのはどれですか?

4

3 に答える 3

24

唯一の違いは、構文と利便性です。

構文的には、1つのケースでは括弧を省略できますが、他のケースでは省略できません。

double d;

sizeof(double); // compiles
sizeof(d);      // compiles
sizeof d;       // compiles
sizeof double;  // does NOT compile

利便性に関する限り、次のようなことを検討してください。

float a;

x = sizeof(float);

y = sizeof(a);

たとえば、aafloatからdoubleに変更することになった場合は、それに合わせてに変更sizeof(float)する必要もありますsizeof(double)sizeof(a)全体を使用する場合、をaからに変更するfloatdouble、すべての使用sizeofも編集なしで自動的に変更されます。後者は、mallocを呼び出す場合など、C++よりもCで問題になることがよくあります。

float *a = malloc(10 * sizeof(float));

対。

float *a = malloc(10 * sizeof(*a));

最初のケースでは、最初のfloatをに変更するdoubleと、コンパイルされるコードが生成されますが、バッファオーバーランが発生します。2番目のケースでは、(のみ)floatをに変更すると正常にdouble機能します。

于 2012-10-10T04:07:55.367 に答える
2

後者は前者の観点から定義されます。式を指定すると、式のタイプのサイズが返されます。したがって、sizeof(vec)に変換されsizeof(std::vector<int>)ます。

どちらもコンパイル時に評価されます。実行時sizeofは、C ++ではなくCで、可変長配列を使用します。toのオペランドsizeofは未評価であるため、式自体がとにかくコードを生成する可能性のある実際の存在はありません。

型が何らかの形で冗長であると述べている可能性があるため、型よりも式を使用することを好みます。

于 2012-10-10T04:04:59.597 に答える
2

を使用するsizeof(<whatever>)場合は常に、コンパイル時に常に評価されます。sizeof関係するのはパラメーターのデータ型です。

ただし、値、さらには式をパラメーターとして渡すことができます。ただし、sizeof関数は、渡されたパラメーターのデータ型のみを考慮します。

式をとして渡すこともできますsizeof(x = x+1);。言うxはintでした。この場合、これsizeofは(私のマシンのように)戻り4、xの値は変更されません。これは、sizeof常にコンパイル時に評価されるためです。

指定した2つの構文セットは同じ結果を返しますが、同等であるとは言えません。しかし、はい、後者は前者の観点から定義されています。

于 2012-10-10T04:21:50.590 に答える