c-多数据类型的单个malloc



我正在尝试编写一个代码,需要多个不同数据类型的数组。这些数组需要动态分配。我需要考虑性能,所以我想用一个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意味着它将指向Nint个位置。即

dA = iA + N; // then, dA = iA + N * sizeof(int)

解决方案

如果希望dA指向位置iA+N,则将iA声明为char*,而不是int*

char *iA; // will solve the problem

如果计划使用混合数据类型(例如int和double),请使用结构

例如

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;

您可以访问&b在MixedType中,类似

int a = dA->a;
double b = dA->b;

相关内容

  • 没有找到相关文章

最新更新