cvAllocの限界

cvAllocはファイルcxalloc.cppに定義されています。
で、その確保できる限界が以下のように定義されていて、

#define CV_MAX_ALLOC_SIZE (((size_t)1 << (sizeof(size_t)*8-2)))

CV_MAX_ALLOC_SIZE = 1073741824 (1024*1024*1024) Byte
つまり、1.0GBが限界と。
あ、32bitコンピュータに限ります。

関数icvCalcEigenObjects_8u32fR内で、おそらく一番メモリを食いそうな部分

c = (float *) cvAlloc( sizeof( float ) * nObjects * nObjects )

最大の基底の数 = sqrt( CV_MAX_ALLOC_SIZE / sizeof( float ) )
つまり、約11585 = sqrt( 1073741824 / 8 )
がんばれば、基底の数1万個がいけるかも。


alloca(size) なんていう関数があるのか、cvAllocあたりを調べてたら出てきた

alloca は、プログラム スタックから size バイトを割り当てます。
割り当てられた領域は、単に割り当てがスコープ外になる場合ではなく、
呼び出し関数が終了する場合に、自動的に解放されます。
このため、alloca から返されたポインタ値を引数として free に渡さないでください。