opencv里面关于CVMAT类型的定义:
typedef struct CvMat
{
int type;
int step;
/* for internal use only */
int* refcount;
int hdr_refcount;
union
{
uchar* ptr;
short* s;
int* i;
float* fl;
double* db;
} data;
#ifdef __cplusplus
union
{
int rows;
int height;
};
union
{
int cols;
int width;
};
#else
int rows;
int cols;
#endif
}
CvMat;
最近写一个代码的时候,浏览一下OPENCV的源码,觉得共用体在这里还是挺方便的,但是弄不清中间的存储结构就不会很好的使用这个结构。
一、 共用体的使用大概有这几点:
1.共用体的定义和结构体差不多
union
{
uchar* ptr;
short* s;
int* i;
float* fl;
double* db;
} data;
2.共用体顾名思意就是里面的的数据占用同一断内存空间,共用体的内存长度等于里面最长的变量。既然占用一段内存空间,你改变任意一个共用体的变量都会改变其他 的成员,而且你不能在同一时刻使用里面的2个变量
二、指针的使用
data共用体里面有好几种类型,如果你想写一个创建矩阵的函数,例如:
/*************************************************
函数名: CreateMatHeader
函数作用 :创建一个矩阵
参数:
cols 列数
rows 行数
type 数据类型
data 数据指针
返回:矩阵的头指针
说明:函数在使用的时候,如果data == NULL ,则创建空间
**************************************************/
CMat *CreateMat(uint cols,uint rows,MAT_DATA_TYPE type, void *data);
你事先不知道DATA的时候类型,VOID*类型不会提供关于数据长度的信息,所以在使用union data的时候你可以对数据类型进行判断,但是这样毕竟太麻烦了,最好的方法是使用union共占一段结构体的特点:直接对字节进行操作,在需要的时候再去转换为其他类型的指针
我做的一个小实验:
void main(void)
{
float pl = (float)5.98789; //浮点数指针
float *data ;
unsigned char *c ;
c =(unsigned char*) malloc(2*sizeof(float));
memcpy(c,&pl,sizeof(float));
data = (float*)c ;
printf("%f",*data);
}
我把浮点数据copy到char类型的指针下,在通过转换为浮点类型,然后输出。。。
三、VC里面的内存分配的问题
1.不同编译器分配的内存
(1)在VC下,下面各类型占字节数为:char->unsigned int ->1; short int ->2;
int ->unsigned int ->4; long ->float->4; double
->long double ->8
(2)在TC下,下面各类型占字节数为:char->unsigned
int ->1; short int ->2; int ->unsigned int ->2; long
->float->4; double ->8; long double ->10
对于vc内存的分配问题的解答:
http://xfeng.bloghome.cn/posts/53651.html。里面详细说了vc下内存分配的问题
文章评论(0条评论)
登录后参与讨论