在C语句中声明数组时,它们可以正常声明:
int arr[10]
或者它们也可以在如下结构中声明:
struct structArr{
int sArr[10];
}s1;
s1.sArr[]
代替arr[]
时是否会有任何内存或空间权衡,若有,为什么?我个人认为arr[]
会比s1.sArr[]
更快,但我不知道我是否正确,而且我没有技术答案。
答案 0 :(得分:5)
我不希望有任何差别,不。
编译器“知道”sArr
字段与s1
的基址的偏移量为0,因此我猜测可以使用完全相同的指令序列完成访问。 / p>
当然,将数组包装在一个结构中可以按值分配和传递/返回它,这可能是很好的好处。
答案 1 :(得分:2)
您的问题的答案取决于编译器和优化。
对于最近至少-O1
优化的GCC编译器,arr[]
不会比s1.sArr[]
快。实际上,如果由于某种原因(例如其他字段)s1
比arr
更对齐,那么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];
仅出于可读性原因。