alloca (__builtin_alloca)

いくらCを完全に内包しているといっても、Objective-Cを使っている以上一行たりともCのコードは書きたくないのだが、ランタイムAPIを初めとしてそこかしこにCのコードがある以上、無視する訳にはいかないのが悲しい。

自動変数でメモリバッファをいちいちアロケーションするのは面倒だなぁと思っていたのだが、Macでも表題の名前を持つ関数が使えるようになっており、ヒープではなくスタック領域にメモリ領域を確保してくれ、更には呼ばれた関数から抜けた際にその領域を自動的に回収してくれる。※

-(void*)hogeType:(const char*)type
{
   char* cleanType = __builtin_alloca(strlen(type) + 1);
   //freeの必要は無い(というかしてはいけない)
}

こんなに便利なallocaだが、C標準ではない拡張機能でありコンパイラや実装に依存するために、使わないことを推奨している環境も多く見られる。

領域をスタックに求めるため当然ながら大きな領域を確保することはできないし、スタックサイズはプラットホームや実装に依存する。移植性の高いコードを目指す場合に問題なることが多いのも推奨されない理由なのかな。

スタックに確保されるので当然だがメソッドの引数や戻り値にも使えない。あーC言語って面倒だ。


※スコープを抜けた時ではないことに注意が必要だ。