「sizeof」の版間の差分
提供: C++入門
(相違点なし)
|
2013年11月2日 (土) 11:12時点における最新版
sizeof とは、データ型のサイズ(バイト)を求める単項演算子です。sizeofは、原則、コンパイル時に計算されます。
読み方
- sizeof
- さいずおぶ
目次
概要
sizeofは、newやmallocなどでメモリを確保するときやファイルやソケットに書き込み(write)や読み込み(read)するときなどに使われます。
配列の大きさを調べる
配列のサイズを調べるサンプルコードです。
#include <iostream> using namespace std; int main(int argc, char const* argv[]) { int i = 0; int a[3] = {0}; char str[] = "hoge"; cout << "i = " << sizeof (i) << endl; cout << "a[] = " << sizeof (a) << endl; cout << "str = " << sizeof (str) << endl; return 0; }
この実行環境では、int が 4byteであるため、int a[3] は、4byte x 3 = 12byte になります。 str が 5 なのは、NULLターミネートのNULL文字の分があるからです。
% g++ sizeof.cpp % ./a.out i = 4 a[] = 12 str = 5
配列の要素数を調べる
配列の要素数をsizeofで調べられます。
これは、正しい例です。
int a[] = {1,2,3}; unsigned int size = sizeof(a)/sizeof(int) // or: unsigned int size = sizeof(a)/sizeof(a[0])
これは、要素数ではありません。これは、大きさです。
int a[] = {1,2,3}; unsigned int size = sizeof(a); // これは、要素数ではなく、大きさになります。
warning: comparison between signed and unsigned integer expressions
#include <iostream> using namespace std; int main(int argc, char const* argv[]) { int a[] = {1,2,3}; for (int i = 0; i < (sizeof(a)/sizeof(int)) ; i++) { cout << a[i] << endl; } return 0; }
上記のコードをコンパイルすると下記の警告が出ます。
% g++ for.cpp for.cpp: In function 'int main(int, const char**)': for.cpp:7: warning: comparison between signed and unsigned integer expressions
問題になっているのは、 sizeof () と int 型を比較している箇所です。 sizeof()が unsigned int であるのに対して、比較対象が int (signed int) です。
for (int i = 0; i < (sizeof(a)/sizeof(int)) ; i++) { }
これを解決するには、 int を unsigned int にします。
for (unsigned int i = 0; i < (sizeof(a)/sizeof(int)) ; i++) { }
g++ の -Wno-sign-compare オプションを使うと警告がでなくなりますが、そうするべきではありません。
g++ -Wno-sign-compare foo.cpp