CV_IMPL CvSeq *
cvCreateSeq( int seq_flags, int header_size, int elem_size, CvMemStorage * storage )
{
CvSeq *seq = 0;
CV_FUNCNAME( "cvCreateSeq" );
__BEGIN__;
if( !storage )
CV_ERROR( CV_StsNullPtr, "" );
if( header_size < (int)sizeof( CvSeq ) || elem_size <= 0 ) //序列頭大小不小於sizeof( CvSeq )
CV_ERROR( CV_StsBadSize, "" );
/* allocate sequence header */ 分配序列頭
CV_CALL( seq = (CvSeq*)cvMemStorageAlloc( storage, header_size ));
//在存儲塊中分配一內存緩衝區
memset( seq, 0, header_size ); //初始化爲0
seq->header_size = header_size;
seq->flags = (seq_flags & ~CV_MAGIC_MASK) | CV_SEQ_MAGIC_VAL;
{
int elemtype = CV_MAT_TYPE(seq_flags);
int typesize = CV_ELEM_SIZE(elemtype);
if( elemtype != CV_SEQ_ELTYPE_GENERIC &&
typesize != 0 && typesize != elem_size )
CV_ERROR( CV_StsBadSize,
"Specified element size doesn't match to the size of the specified element type "
"(try to use 0 for element type)" );
}
seq->elem_size = elem_size;
seq->storage = storage;
CV_CALL( cvSetSeqBlockSize( seq, (1 << 10)/elem_size )); //設置序列塊的大小;當序列緩衝區中空間消耗完時,函數爲 delta_elems 個序列元素分配空間。如果新分配
//的空間與 之前分配的空間相鄰的話,這兩個塊就合併,否則,就創建了一個新的序列快。設置seq->delta_elems
__END__;
return seq; //cvCreateSeq完成了對cvseq結構體 flags、header_size、elem_size、delta_elems的填充;
}
其中
CV_IMPL void*
cvMemStorageAlloc( CvMemStorage* storage, size_t size )
{
char *ptr = 0;
CV_FUNCNAME( "cvMemStorageAlloc" );
__BEGIN__;
if( !storage )
CV_ERROR( CV_StsNullPtr, "NULL storage pointer" );
if( size > INT_MAX )
CV_ERROR( CV_StsOutOfRange, "Too large memory block is requested" );
assert( storage->free_space % CV_STRUCT_ALIGN == 0 );
if( (size_t)storage->free_space < size )
{
size_t max_free_space = cvAlignLeft(storage->block_size - sizeof(CvMemBlock), CV_STRUCT_ALIGN);
if( max_free_space < size )
CV_ERROR( CV_StsOutOfRange, "requested size is negative or too big" );
CV_CALL( icvGoNextMemBlock( storage ));
}
ptr = ICV_FREE_PTR(storage);
assert( (size_t)ptr % CV_STRUCT_ALIGN == 0 );
storage->free_space = cvAlignLeft(storage->free_space - (int)size, CV_STRUCT_ALIGN );
__END__;
return ptr;
}