【发布时间】:2019-03-25 05:00:06
【问题描述】:
我需要实现一个可以处理任何类型的简单动态数组。
现在我的void** 实现比直接使用int* 慢约50%:
#define N 1000000000
// Takes ~6 seconds
void** a = malloc(sizeof(void*) * N);
for (int i =0; i < N; i++) {
*(int*)(&a[i]) = i;
}
printf("%d\n", *(int*)&a[N-1]);
// Takes ~3 seconds
int* b = malloc(sizeof(int) * N) ;
for (int i =0; i < N; i++) {
b[i] = i;
}
printf("%d\n", b[N-1]);
我不是 C 专家。有没有更好的方法来做到这一点?
谢谢
编辑
看起来使用void** 是个坏主意。有没有办法用void* 实现这个?
这是它在 Go 中的实现方式:
type slice struct {
array unsafe.Pointer
len int
cap int
}
我想做类似的事情。
edit2
我设法用void* 实现了这一点。
解决方案非常简单:
void* a = malloc(sizeof(int) * N);
for (int i = 0; i < N; i++) {
((int*)a)[i] = i;
}
printf("%d\n", ((int*)a)[N-1]);
现在的性能是一样的。
【问题讨论】:
-
您的编译器可能很难优化第一个版本,因为您的指针类型不一致;没有指向指针的指针,但你声明
void** a。 -
void **a和所有这些诡计的目的是什么?这应该解决什么问题? -
看起来
void** a版本会导致未定义的行为。你有一个指向指针类型的指针,你初始化了第一个点数组,但是指向的指针没有被初始化,你写入它们。基本上,您正在写入一个充满垃圾指针的数组。 -
可能
sizeof(void*)大于sizeof(int)提示:您可以打印尺寸!
标签: c dynamic-arrays void-pointers