c - 多个数据类型的单个 malloc

标签 c arrays linux malloc memory-alignment

我正在尝试编写一个需要不同数据类型的多个数组的代码。这些数组需要动态分配。我需要考虑性能,因此我想通过一次 malloc 调用来分配所有数组。

对于简单的情况,假设我需要一个整数和一个 double float 组。因此,我正在执行以下操作。

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 编译代码。

最佳答案

what is the best way (in terms of performance) to allocate memory if you need multiple array of different data types?

  • 如果您需要大量内存,多次调用 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];
      ...
    }
    

关于c - 多个数据类型的单个 malloc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26882994/

相关文章:

arrays - Swift - 连接循环数组

linux - 如何创建一个可以替代 C shell 参数的别名?

c++ - 如何让 g_print() 出现?

c - 制作一个函数来更新二维数组井字游戏表的 Action

Java:在 HTTP Post 中发送带有其他参数的 byte[]

c - 旋转二维数组 -> 反转循环

java - 统计 ArrayList 中一定范围内的数字

java - 执行java类时无法在linux服务器中添加jar

java - Java 中的 C 数据类型

c - 为什么我的阶乘程序可以运行,但我几乎相同的 pow 程序却无法运行?