vlc源码分析--结构体使用

针对这些结构体+指针的使用,自己专门整理了下,主要从oop面向对象的思想进行了对比,方便理解其中的妙处。(纯属个人见解)

1.0 公共形式和差别化定义(..,.不知道有没有一个专门的描述,自己给起的 ( ̄□ ̄||) )

由于基本上是C写的框架(个人前期用的多的是C,对于java中动不动就框架架构什么的概念 没有那么特别划分,纯c,开源,其实就已经弱化了这个 “框”的概念了,你有需要大可改进,不必受此"框"的限制。但是对于这个架构的思想,还是要有的),很重要的一个东西,就是结构体,可以基本对应 面向对象编程中的“类”。

结构体的定义,在 vlc源码中 ,vlc_es_out.h  es_out.c  es_out_timeshift.c三个文件中,都有涉及到es_out_t这个结构体。他们的关系是这样的

在vlc_common.h文件中定义 struct es_out_t结构体的时候,指定了内部成员 struct es_out_sys_t *; 但是这个sturct es_out_syst_t类型这个时候是并没有定义的,真正使用stuct es_out_t的时候,才定义其内部的 struct es_out_sys_t 这个结构体,所以es_out.c文件和 es_out_timeshitf.c文件 中分别定义了各自的 struct es_out_sys_t, (有点 c++里面虚函数的味道)。

关于具体的c语言和 gcc对这个的支持性,做了个实验:(环境  gcc (Ubuntu 7.3.0-27ubuntu1~18.04) 7.3.0 )

上面程序前面两个用gcc编译,运行,都正常,最后一个,gcc编译第8行报错,把第12行打开也会报错,需要把struct_test2的类型定义提前。

2.0 基类 (这也是自己联想的,请别被误导(^_^ ))

结构体之间的关联多数都是通过指针的形式,实际需要的时候才会创建并分配内存。

在vlc源码中,有这么一个公共函数

void *vlc_custom_create(vlc_object_t *parent, size_t length, const char *typename),这个函数内部有相关注释

 /* NOTE:
     * VLC objects are laid out as follow:
     * - first the LibVLC-private per-object data,
     * - then VLC_COMMON members from vlc_object_t,
     * - finally, the type-specific data (if any).
     *
     * This function initializes the LibVLC and common data,
     * and zeroes the rest.
     */

解释一下,调用这个函数的时候,会开辟一块内存,(实际还有一些内部其他操作,这里不关注)这块内存空间的大小是 commen +  length, commen 是这些有联系的结构体都首先 包含的一个数据成语,(在每一个结构体的首部),length即函数的第二个参数。最后对应的 内存空间为:

每一调用该函数的地方可以自行决定自己的数据类型,最后各种结构体,对外统一都可以通过 commen来访问,统一了函数接口,又可以差异化私有数据。要想访问自己的私有数据,通过指针偏移 固定的 commen大小即可。和 linux 内核的 链表的实现有相似的思想。也有点c++中类型向上转型的意思。

猜你喜欢

转载自blog.csdn.net/u012459903/article/details/88967103
今日推荐