- 论坛徽章:
- 1
|
原帖由 tm_wb 于 2009-4-11 22:38 发表 ![]()
现在cstl也可以保存指针,但是需要这样需要用户做很多额外的工作,还有就是复制数据的时候很麻烦。
传(空)指针,可以减少数据复制 用户额外做的事情也不多 我来班门弄斧一下,说说传值和传指针用户使用上的区别
我这里说的数据结构不特指 cstl 中的
首先用户定义了一个结构
typedef sturct {
int a;
void *b;
...
} abc_t;
如果用户自定义结构内有指针变量,那这个指针应该是指向heap上数据的指针,至少也应该是指向全局变量的(不建议用啊)
定义一个类型为 abc_t 的变量
传值:
abc_t abc; // abc是一个stack上的变量
传指针:
abc_t *abc = malloc(*abc); // abc是一个heap上的变量
修改这个 abc
传值:
abc.a = 10;
...
传指针:
abc->a = 10;
...
插入到一个 cstl 的数据结构里面
传值:插入函数会有一个malloc(sizeof(abc_t)在heap上申请内在用于保存用户数据 一个memcpy(,,sizeof(abc_t) 把stack上的数据复制到heap上
传指针:指针赋值
从cstl 的数据结构里面取出一个数据
传值:取出函数会有一个memcpy(,,sizeof(abc_t) 把heap上的数据复制到stack上(也可能传指针,对不起没来得及看代码)
传指针:指针赋值
修改一个 cstl 的数据结构里
传值:修改函数会有一个memcpy(,,sizeof(abc_t) 把stack上的数据复制到heap上(如果取出操作返回的是指针,这步也没有)
传指针:无(因为通过指针修改heap上的数据会立即生效)
从cstl 的数据结构里面删除一个数据
传值:这里有点麻烦,要调用用户的释放函数,不能简单的free,所以不符合内存谁申请释放的原则
传指针:把这个地址返回给用户,让用户自己释放
以上我是所能想到的传值和传指针的区别,其实也是用宏和用空指针来实现通用数据结构的区别。 所以传指针可以减少内存copy,而用户所以 做事情并没有增加,只是用户上的方法不同。 |
|