正常数组声明和结构内声明的数组之间的内存和效率差异

时间:2013-01-04 08:43:36

标签: c declaration performance

在C语句中声明数组时,它们可以正常声明:

int arr[10]

或者它们也可以在如下结构中声明:

struct structArr{
   int sArr[10];
}s1;
  1. 使用s1.sArr[]代替arr[]时是否会有任何内存或空间权衡,若有,为什么?
  2. 任何一种形式是否比另一种形式更有效,更快?
  3. 我个人认为arr[]会比s1.sArr[]更快,但我不知道我是否正确,而且我没有技术答案。

4 个答案:

答案 0 :(得分:5)

我不希望有任何差别,不。

编译器“知道”sArr字段与s1的基址的偏移量为0,因此我猜测可以使用完全相同的指令序列完成访问。 / p>

当然,将数组包装在一个结构中可以按值分配和传递/返回它,这可能是很好的好处。

答案 1 :(得分:2)

您的问题的答案取决于编译器和优化。

对于最近至少-O1优化的GCC编译器,arr[]不会比s1.sArr[]快。实际上,如果由于某种原因(例如其他字段)s1arr更对齐,那么s1.sArr[]可能会稍微好一些(因为缓存效应)(例如因为更符合缓存行大小)。但实际上,从性能的角度来看,使用arr[]s1.sArr[](几乎大部分)是相同的。

出于可读性原因,事情可能会有所不同。您可能希望将相关项目打包到某些struct中。 (并且您可能希望避免使用过多的变量名称)。

答案 2 :(得分:2)

要添加其他答案,虽然潜在的性能和内存差异几乎可以随时忽略不计,但使用此结构间接事物可以确定数组的大小,即使传递给函数(没有衰减到指针)。这非常有用。

考虑以下计划:

#include <stdio.h>

typedef struct {
    int arr[10];
} my_arr;

void foo1(my_arr arr) {
    printf("%d\n", sizeof(arr.arr));
}

void foo2(int arr[10]) {
    printf("%d\n", sizeof(arr));
}

int main() {
    my_arr a1;
    foo1(a1); /* prints 40 on my machine (10*sizeof(int)) */

    int a2[10];
    foo2(a2); /* prints 8 on my machine (sizeof(int*)) */
}

答案 3 :(得分:0)

我不认为差异(如果有的话)值得失眠。

如果您的示例已完成,我会选择int arr[10];仅出于可读性原因。