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++中类型向上转型的意思。

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值