我正在尝试编写一个代码,需要多个不同数据类型的数组。这些数组需要动态分配。我需要考虑性能,所以我想用一个malloc
调用来分配所有阵列。
对于简单的情况,假设我需要一个整数和一个双精度浮点数组。因此,我正在做以下事情。
int *iA;
double *dA;
void *vp;
vp = malloc( (sizeof(int)+sizeof(double))*N ); // assume N is known at this point.
// now to set the array pointers I am doing the following.
iA = vp;
dA = (void*)(iA+N); // This is wrong!!
...
free(vp);
如果vp中的地址是8的倍数(通常是),并且N是奇数,则dA被设置为不是8的倍数的地址。这会引起各种各样的问题。如果我交换iA和dA分配,应该没问题。这似乎是一个简单的解决方案,但如果我有两个以上的数组和两个以上不同的类型,它可能无法解决问题。我不确定。
所以,我的问题是,如果您需要多个不同数据类型的数组,分配内存的最佳方式(就性能而言)是什么?
注意:我在一台64位Linux机器上,使用gcc-4.9.0编译代码。
如果您需要多个不同数据类型的数组,那么分配内存的最佳方式(就性能而言)是什么?
-
如果您需要非常大的内存,那么多次调用malloc的开销很可能是可以忽略的,而尝试手动优化调用很可能只是成熟前的优化。
-
如果您不需要大量内存,请使用VLA。这些通常是在堆栈上分配的(编译器通过调用alloca或类似方法来实现它们),因此它们比动态分配更快、更安全。例如:
void local_function (size_t d_arr_n, size_t i_arr_n, ...) { double double_arr [d_arr_n]; int int_arr [i_arr_n]; ... }
问题
你已经申报了,
int *iA;
如果将一个整数添加到iA,N意味着它将指向N第int个位置。即
dA = iA + N; // then, dA = iA + N * sizeof(int)
解决方案
如果希望dA指向位置iA+N,则将iA声明为char*,而不是int* 如果计划使用混合数据类型(例如int和double),请使用结构。 例如 然后使用malloc动态分配内存, 如果您想要N大小的MixedType数组;然后, 按照你的代码分配dA, 您可以访问&b在MixedType中,类似char *iA; // will solve the problem
struct MixedType
{
int a;
double b;
};
MixedType *iA = (MixedType *)malloc(sizeof(MixedType));
MixedType *iA = (MixedType *)malloc(sizeof(MixedType) * N);
dA = (MixedType *)iA;
int a = dA->a;
double b = dA->b;