4

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

int arr[10]

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

struct structArr{
   int sArr[10];
}s1;
  1. s1.sArr[]使用代替时会不会有任何内存或空间权衡arr[],如果是,为什么?
  2. 任何一种形式都比另一种形式更有效、更快吗?

我个人认为这arr[]会更快,s1.sArr[]但我不知道我是否正确,而且我没有技术答案。

4

4 回答 4

5

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

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

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

于 2013-01-04T08:49:57.970 回答
2

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

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

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

于 2013-01-04T08:48:52.813 回答
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*)) */
}
于 2013-01-04T08:59:45.223 回答
0

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

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

于 2013-01-04T08:46:45.563 回答