我正在尝试编写一个代码,我需要多个不同数据类型的数组。需要动态分配这些数组。我需要考虑性能,所以我想通过一次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编译代码。
答案 0 :(得分:1)
如果需要多个不同数据类型的数组,分配内存的最佳方式(在性能方面)是什么?
如果您需要非常大量的内存,多次调用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];
...
}
答案 1 :(得分:1)
<强>问题强>
你宣布了,
int *iA;
如果您添加整数, N 到iA意味着,它将指向 N int 位置。即,
dA = iA + N; // then, dA = iA + N * sizeof(int)
<强>解决方案强>
如果您希望dA指向某个位置iA + N,则将iA声明为 char * ,而不是 int * 。
char *iA; // will solve the problem
如果您打算使用混合数据类型(例如int和double),请使用 struct 。
e.g。
struct MixedType
{
int a;
double b;
};
然后使用malloc动态分配内存,
MixedType *iA = (MixedType *)malloc(sizeof(MixedType));
如果你想要N大小的MixedType数组;然后,
MixedType *iA = (MixedType *)malloc(sizeof(MixedType) * N);
在代码中分配dA,
dA = (MixedType *)iA;
你可以访问&amp; b,在MixedType中,
int a = dA->a;
double b = dA->b;