簡単な説明:sizeofキーワード
一、sizeofの役割 SizeofはC/C++のキーワードであり、演算子であり、1つのオブジェクト(データ型またはデータオブジェクト)の長さ(すなわち、byte単位でメモリを占有するサイズ)を取得する役割を果たす.タイプには、voidを除く基本データ型、ユーザー定義タイプ(構造体、クラス)、関数タイプが含まれます.データ・オブジェクトとは、前述したタイプで定義された一般変数とポインタ変数(voidポインタを含む)を指します.
注意:1.sizeofはキーワードであり、演算子でもありますよ!演算子であることを無視する人が多い.(ここで補足するとsizeofは単語形式で現れる唯一の演算子であり、実際には単目演算子の役割を果たしている).2.sizeofは関数ではありません!ほとんどの人はsizeofが関数ではないことを知っているかもしれませんが、具体的な原因はぼやけています.ここで説明する(例えば、
二、sizeofの注意問題 sizeofはvoidタイプの長さを求めることはできないが、voidタイプのポインタの長さを求めることができる. sizeofで文字列を求める場合は、末尾の'0'を加算します. sizeofは動的メモリ割り当てのサイズを求めることができない. sizeof不完全な配列の長さを求めることはできません.そうしないと、コンパイルエラーが発生します.
注意:ここでの不完全な主演は2次元が2次元以上の配列を含むことを指し、例えば:
式がsizeofのオペランドである場合、式の計算結果のタイプサイズを返しますが、式は評価されません.例:
実行結果:n 1=4 n 2=1は、デフォルトのタイプ変換のため、式ch+numの計算結果タイプがintであるため、n 1=4である.一方、ch=ch+numの計算結果はcharであり、ch+numの計算結果はintであり、chに結果を付与するとタイプ変換が行われるため、式の最終タイプはcharであるため、n 2=1となる. sizeofは、関数呼び出しのサイズを求めることができ、求めたサイズは戻りタイプ(関数タイプ)のサイズに等しいが、関数体は実行されない. sizeofで求めた構造体(およびそのオブジェクト)のサイズは、各データメンバーオブジェクトのサイズの和に等しくない.(すなわちsizeofは、構造体のビットドメインメンバーのサイズを求めるのに使用できないが、ビットドメインメンバーを含む構造体のサイズを求めることができる).
構造体のメモリの位置合わせの理由で、私が前に書いた構造体のメモリの位置合わせに関するブログを見ることができます.
注意:1.sizeofはキーワードであり、演算子でもありますよ!演算子であることを無視する人が多い.(ここで補足するとsizeofは単語形式で現れる唯一の演算子であり、実際には単目演算子の役割を果たしている).2.sizeofは関数ではありません!ほとんどの人はsizeofが関数ではないことを知っているかもしれませんが、具体的な原因はぼやけています.ここで説明する(例えば、
i=sizeof(int)
、このような式は、sizeofが関数であると容易に思われる.それが関数であると仮定すると、sizeof int
のような式は成立しないが、実際にはsizeof int
という式は正常に動作するので、sizeofは絶対に関数ではない).二、sizeofの注意問題
注意:ここでの不完全な主演は2次元が2次元以上の配列を含むことを指し、例えば:
int arr[][10]
のような配列の大きさを求めることができるが、int arr[10][]
のようなものは求めることができず、コンパイルが間違っている.#include
using namespace std;
int main()
{
char ch = 1;
int num = 1;
int n1 = sizeof(ch + num);
int n2 = sizeof(ch = ch + num);
cout << "n1=" << n1 << endl;
cout << "n2=" << n2 << endl;
return 0;
}
実行結果:n 1=4 n 2=1は、デフォルトのタイプ変換のため、式ch+numの計算結果タイプがintであるため、n 1=4である.一方、ch=ch+numの計算結果はcharであり、ch+numの計算結果はintであり、chに結果を付与するとタイプ変換が行われるため、式の最終タイプはcharであるため、n 2=1となる.
構造体のメモリの位置合わせの理由で、私が前に書いた構造体のメモリの位置合わせに関するブログを見ることができます.