您的位置:首页 > 其它

节点拷贝解决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是弱类型的,所以遇到类型不匹配问题尤为需要注意。

 

我们知道,内存拷贝对高性能服务器会造成很大的影响,而且,内存拷贝也会带来数据一致性的问题。一般说来,我们可以在一个容器进行内存拷贝,而其他容器直接执行指针。这样的话,实际上也只有一次内存拷贝,而且数据一致性也可以得到保证。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息