单个malloc用于多种数据类型

时间:2014-11-12 09:04:38

标签: c arrays linux malloc memory-alignment

我正在尝试编写一个代码,我需要多个不同数据类型的数组。需要动态分配这些数组。我需要考虑性能,所以我想通过一次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编译代码。

2 个答案:

答案 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;