在 C 中声明数组时,它们可以正常声明如下:
int arr[10]
或者它们也可以在如下结构中声明:
struct structArr{
int sArr[10];
}s1;
s1.sArr[]
使用代替时会不会有任何内存或空间权衡arr[]
,如果是,为什么?- 任何一种形式都比另一种形式更有效、更快吗?
我个人认为这arr[]
会更快,s1.sArr[]
但我不知道我是否正确,而且我没有技术答案。
在 C 中声明数组时,它们可以正常声明如下:
int arr[10]
或者它们也可以在如下结构中声明:
struct structArr{
int sArr[10];
}s1;
s1.sArr[]
使用代替时会不会有任何内存或空间权衡arr[]
,如果是,为什么?我个人认为这arr[]
会更快,s1.sArr[]
但我不知道我是否正确,而且我没有技术答案。
我不希望有任何区别,不。
编译器“知道”该sArr
字段与基地址的偏移量s1
为 0,因此我猜想可以使用完全相同的指令序列来完成访问。
当然,将数组包装在一个结构中可以按值分配和传递/返回它,这可能是很好的好处。
您的问题的答案取决于编译器和优化。
使用至少经过-O1
优化的最新 GCC 编译器,arr[]
不会比s1.sArr[]
. 实际上,如果由于某种原因(例如,它的其他字段)s1
比原来更对齐arr
,那么它可能会发生(由于缓存效应)s1.sArr[]
可能会稍微好一些(例如,因为与缓存行大小更对齐)。但实际上从性能的角度来看,使用arr[]
or s1.sArr[]
(几乎大部分)是相同的。
出于可读性的原因,事情可能会有所不同。您可能希望将相关项目打包到一些struct
. (并且您可能希望避免使用过多的变量名)。
添加到其他答案中,虽然潜在的性能和内存差异几乎在任何时候都可以忽略不计,但使用这个结构间接的东西可以让你确定数组的大小,即使是在传递给函数时(不会衰减到指针)。这可能非常有用。
考虑以下程序:
#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*)) */
}
我不认为差异(如果有的话)值得失眠。
如果您的示例是完整的,我会选择int arr[10];
仅出于可读性原因。