sizeofについて

http://d.hatena.ne.jp/isshiki/20080213
http://morihyphen.hp.infoseek.co.jp/log2/200802.html#020813
http://morihyphen.hp.infoseek.co.jp/log2/200802.html#02142
http://www.kt.rim.or.jp/%7ekbk/zakkicho/08/zakkicho0802b.html#D20080212-3
http://d.hatena.ne.jp/isshiki/20080213/p1
をたまたま見て。

static int size_print(int size)
{
	int array[size];

	printf("array size %d\n", sizeof(array));
}

自分はC99な環境だったら普通に書くなあ。

ほへえ。知らなかった。てっきり「コンパイル時定数(こんな言葉あったっけ?)」かと思ってた。

たしか違ったはず。


なのでこんなコードは遅くなる(はず)。

hoge(size){
	int i;
	int array[size];

	for(i=0;i<sizeof(array)/sizeof(int);i++){	//毎回sizeof()を計算する。
		//なにか処理
	}
}


こう書くべき。

hoge(size){
	int i;
	int array[size];

	for(i=0;i<size;i++){
		//なにか処理
	}
}


まあ、最適化すれば変わるかも知れないけど。
コンパイラ次第だね。


gccアセンブリを吐いてみると、やっぱり違う。
最適化をすれば大分ましにはなったけどやっぱり違う。
ほかのコンパイラは持ってないので知らない。


まあ、そもそもsizeofが演算子ということを知らない人もいるけどね。

C99準拠らしいので、ついうっかり // のコメント使っちゃうような人はバンバン使っても構わないということですね!


//が使えるからといってC99準拠とは限らないかと。
コンパイラの独自拡張でC89の時代でも//が使えるコンパイラはあったような。