节点拷贝解决C容器扩展复杂度问题
2009-08-05 14:00
267 查看
在C中,容器节点的扩展是个很复杂的问题,使用节点拷贝可以解决。
我在C和C++的使用环境
一文中曾经谈到过,C容器在解决继承性扩展以及管理关系比较复杂时,比较麻烦。现在我使用节点拷贝方式解决编程性复杂度。办法是这样的,假设我们定义一个链表:
typedef struct _list_st list_t ;
typedef struct _list_node_st list_node_t;
strcut _list_st{
list_node_t *head ;
void *(*node_copy)(list_t *list , void *value) ;
void (*node_free)(void *value) ;
} ;
struct _list_node_st{
list_node_t *next ;
void *value ;
} ;
我们再为这个链表定义两个API接口,完成push和pop的功能。
list_node_t *list_push(list_t *list , void *value) ;
list_node_t *list_pop(list_t *list) ;
当push的时候,只要指定要需要插入到链表的指针就可以了,链表通过node_copy将void *value复制到节点list_node_t的value成员下。实际上,list_push的参数value和list_node_t的value成员是指向不同的位置,但内容是一样的,由node_copy函数完成拷贝。
而list_node_t节点的生成是内部隐式完成的,对于外部来说,结构一直都是list_node_t类型的,至于value如果解析,由应用自己来完成。于是,对于应用来说,list的接口API就成了公共接口,这样就能够降低继承性地扩展。对于管理关系复杂地应用来说,应用依然只要关注自己对value是如何解析地。
在C++中,模版能够解决容器对不同类型地兼容问题。但C中,使用这种方法,同样可以实现,而且只要增加一点代码,比如node_copy和node_free,但却换来更多的灵活性。同时需要注意的是,由于void是弱类型的,所以遇到类型不匹配问题尤为需要注意。
我们知道,内存拷贝对高性能服务器会造成很大的影响,而且,内存拷贝也会带来数据一致性的问题。一般说来,我们可以在一个容器进行内存拷贝,而其他容器直接执行指针。这样的话,实际上也只有一次内存拷贝,而且数据一致性也可以得到保证。
我在C和C++的使用环境
一文中曾经谈到过,C容器在解决继承性扩展以及管理关系比较复杂时,比较麻烦。现在我使用节点拷贝方式解决编程性复杂度。办法是这样的,假设我们定义一个链表:
typedef struct _list_st list_t ;
typedef struct _list_node_st list_node_t;
strcut _list_st{
list_node_t *head ;
void *(*node_copy)(list_t *list , void *value) ;
void (*node_free)(void *value) ;
} ;
struct _list_node_st{
list_node_t *next ;
void *value ;
} ;
我们再为这个链表定义两个API接口,完成push和pop的功能。
list_node_t *list_push(list_t *list , void *value) ;
list_node_t *list_pop(list_t *list) ;
当push的时候,只要指定要需要插入到链表的指针就可以了,链表通过node_copy将void *value复制到节点list_node_t的value成员下。实际上,list_push的参数value和list_node_t的value成员是指向不同的位置,但内容是一样的,由node_copy函数完成拷贝。
而list_node_t节点的生成是内部隐式完成的,对于外部来说,结构一直都是list_node_t类型的,至于value如果解析,由应用自己来完成。于是,对于应用来说,list的接口API就成了公共接口,这样就能够降低继承性地扩展。对于管理关系复杂地应用来说,应用依然只要关注自己对value是如何解析地。
在C++中,模版能够解决容器对不同类型地兼容问题。但C中,使用这种方法,同样可以实现,而且只要增加一点代码,比如node_copy和node_free,但却换来更多的灵活性。同时需要注意的是,由于void是弱类型的,所以遇到类型不匹配问题尤为需要注意。
我们知道,内存拷贝对高性能服务器会造成很大的影响,而且,内存拷贝也会带来数据一致性的问题。一般说来,我们可以在一个容器进行内存拷贝,而其他容器直接执行指针。这样的话,实际上也只有一次内存拷贝,而且数据一致性也可以得到保证。
相关文章推荐
- Spring Cloud Config Server迁移节点或容器化带来的问题 原因,解决
- gpexpand扩展集群节点过程及问题解决
- 如何解决Eureka Server不剔除已关停的节点的问题
- CRS-0184: Cannot communicate with the CRS daemon.之节点脱离集群问题解决
- 解决treeview的同一节点单击多次的执行问题
- 一个有意思的类扩展 有效解决判空问题
- 如何解决从VB中拷贝的代码放在CSDN博客中成为乱码的问题
- AIX下Oracle 10g RAC 双节点时间不同步问题解决
- Kubernetes slave节点升级至1.3版本注册失败问题解决
- 使用zoom、overflow解决IE6、IE7、FF下嵌套容器清除浮动问题
- 用友nc65 uap开发中系统出现卡,慢等问题解决思路一(临时合同节点处理)
- asp.net 扩展解决共享两个网站的图片问题
- javascript之解决dom中存在的空白节点问题
- 解决spring-cloud应用无法部署在同一个容器中的问题
- 问题解决:无法载入MYSQL扩展,请检查PHP配置
- 解决maven3和myeclipse8.6结合后配置文件无法自动拷贝到对应目录问题
- rsync命令----解决远程拷贝一个问题通过scp不能复制ln文件
- 一致性哈希虚节点解决雪崩问题
- 解决windows下Composer因php_openssl扩展缺失而安装失败的问题
- 解决Mac OS X 自带PHP环境gd库扩展缺少freetype的问题