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;
}