使用 “void指针和size” 来保存数据

king_on 2012-05-20 10:56:27
我想实现一个栈结构,能够保存不同数据类型的数据(类似模板)
现在我想通过void指针和数据类型字节数 来保存用户数据
比如:void *pArray=malloc(arrayLength * elementTypeSize);//这样pArray就指向了arrayLength个元素的数组,该数组每个元素能够保存elementType数据。

我有两个问题:
1. 使用这种方式的利弊,之前我看有用宏定义模板的,感觉不好调试。于是就想到了这种方法。另外内部拷贝数据使用的memcpy函数,是不是效率比较低?
2. 有没有个方法能够将定义这样一个指针:
这个指针类型占用字节正好等于用户指定的elementTypeSize
...全文
263 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
cryingbee 2012-05-25
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 的回复:]

引用 12 楼 的回复:

第二个问题,32位机中不是所有类型指针占用字节都是4么,楼主说的是指针指向空间的大小吧,但是我还是没有明白楼主第二个问题的意思

对,我写的不太清楚。
例子:int *pi; pi指向空间是以sizeof(int)个字节为单位的(好吧,谁能告诉我该怎么表达?)
现在我想的就是能不能定义这样一个指针ptr,它指向空间是以elementSize个字节为单位的……
[/Quote]
我个人感觉不可能实现。原因是类型的大小都是在编译的时候决定的(sizeof),如果elementSize是个变量,那就不可能在编译的时候知道它的大小。所以楼主还是继续使用模板,或者在c里用宏定义。
cryingbee 2012-05-25
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 的回复:]

引用 9 楼 的回复:

应该能进行加减运算,而且偏移为一个字节,也就是说void指针指向类型大小为1字节。
[/Quote]

楼主应该是用C写程序,C语言是允许void*做加减操作的。我开始以为楼主写的是C++。C++是明确规定void*不能做加减操作的。
king_on 2012-05-23
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]

第二个问题,32位机中不是所有类型指针占用字节都是4么,楼主说的是指针指向空间的大小吧,但是我还是没有明白楼主第二个问题的意思
[/Quote]
对,我写的不太清楚。
例子:int *pi; pi指向空间是以sizeof(int)个字节为单位的(好吧,谁能告诉我该怎么表达?)
现在我想的就是能不能定义这样一个指针ptr,它指向空间是以elementSize个字节为单位的,其中elementSize是个变量。
king_on 2012-05-23
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

引用 7 楼 的回复:

引用 4 楼 的回复:
1. memcpy 的效率还是很高的
2. 如果elementTypeSize是个常量,那么struct {char data[elementTypeSize];} * myStruct;就是你要的size。但如果elementTypeSize只是个变量,那你就还是用char×或(uint8_t×)来做pArray吧,这样移动的时候就……
[/Quote]
应该能进行加减运算,而且偏移为一个字节,也就是说void指针指向类型大小为1字节。
长安宁 2012-05-22
  • 打赏
  • 举报
回复
1、你要使用模拟栈,那么得需要 栈顶和栈底指针各一个
struct stack *my_stack malloc( sizeof(*my_stack) * size );
struct stack *buttom = &my_stack[size];
struct stack *top = my_statk;

2、由于你使用了不同的类型元素,所以你需要,对齐一下,占用的空间,并且记录一下,占用的大小
struct stack *node = my_stack;
int sz = (sizeof(something)+3) & (^3);
node->size=128; //字节
memcpy(node->something,something,sizeof(something));
node->next = NULL;

struct stack *priv = my_statck;
while(priv->next)
{
priv = priv->next;
}
priv->next = node;

3、你得判断,空间剩余量
liuche1990 2012-05-22
  • 打赏
  • 举报
回复
第二个问题,32位机中不是所有类型指针占用字节都是4么,楼主说的是指针指向空间的大小吧,但是我还是没有明白楼主第二个问题的意思
quwei197874 2012-05-22
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
1. memcpy 的效率还是很高的
2. 如果elementTypeSize是个常量,那么struct {char data[elementTypeSize];} * myStruct;就是你要的size。但如果elementTypeSize只是个变量,那你就还是用char×或(uint8_t×)来做pArray吧,这样移动的时候就+elementTypeSize。
[/Quote]如果数量(百万级)很大memcpy效率就低了
cryingbee 2012-05-22
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

引用 4 楼 的回复:
1. memcpy 的效率还是很高的
2. 如果elementTypeSize是个常量,那么struct {char data[elementTypeSize];} * myStruct;就是你要的size。但如果elementTypeSize只是个变量,那你就还是用char×或(uint8_t×)来做pArray吧,这样移动的时候就+elementTypeSize……
[/Quote]

void指针是不能做加减操作的,原因是编译器不知道你指向东西的大小,所以不知道具体偏移多少。
king_on 2012-05-20
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
C/C++ code

init a pointer list:

void* *ptr_list = NULL;
int size = 0;

to append a new elem into ptr_list:

void* *ptr_list = (void**)realloc(ptr_list, (size + 1) * sizeof(void*));
ptr_lis……
[/Quote]
void二维指针
我还是用一维指针模拟吧
king_on 2012-05-20
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
1. memcpy 的效率还是很高的
2. 如果elementTypeSize是个常量,那么struct {char data[elementTypeSize];} * myStruct;就是你要的size。但如果elementTypeSize只是个变量,那你就还是用char×或(uint8_t×)来做pArray吧,这样移动的时候就+elementTypeSize。
[/Quote]
这样啊,太麻烦了,我还是直接对void指针进行运算吧。对void指针进行自增运算,void指针是增加一个字节吗?void指针指向数据是一个字节吧
king_on 2012-05-20
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
第二问没有看懂。对于第一问,不用担心,我看过VC中memory的实现(汇编代码),其实现非常优秀,性能很好,不用担心。
[/Quote]
哦,多谢
我这样实现也可以说是个“栈的模板”,这种实现方式怎么样,有没有什么好的c语言实现模板的方法?
AnYidan 2012-05-20
  • 打赏
  • 举报
回复
lz 不必担心 memcpy函数 的效率,优化过的
cryingbee 2012-05-20
  • 打赏
  • 举报
回复
1. memcpy 的效率还是很高的
2. 如果elementTypeSize是个常量,那么struct {char data[elementTypeSize];} * myStruct;就是你要的size。但如果elementTypeSize只是个变量,那你就还是用char×或(uint8_t×)来做pArray吧,这样移动的时候就+elementTypeSize。
qq120848369 2012-05-20
  • 打赏
  • 举报
回复
init a pointer list:

void* *ptr_list = NULL;
int size = 0;

to append a new elem into ptr_list:

void* *ptr_list = (void**)realloc(ptr_list, (size + 1) * sizeof(void*));
ptr_list[size] = (void*)ptr_your_object;
++ size;

jackyjkchen 2012-05-20
  • 打赏
  • 举报
回复
如果memcpy是性能瓶颈,那你什么都别干了。

liangbch 2012-05-20
  • 打赏
  • 举报
回复
第二问没有看懂。对于第一问,不用担心,我看过VC中memory的实现(汇编代码),其实现非常优秀,性能很好,不用担心。

69,372

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧