【发布时间】:2013-10-20 18:05:17
【问题描述】:
我是 C 语言新手,所以我的问题可能不符合高标准
我们可以使用
struct mat{
int a[10];
};m[10];
而不是
int mat[10][10];
有什么区别? 哪个更高效?
【问题讨论】:
-
我认为这里的区别在于更容易理解。
标签: c
我是 C 语言新手,所以我的问题可能不符合高标准
我们可以使用
struct mat{
int a[10];
};m[10];
而不是
int mat[10][10];
有什么区别? 哪个更高效?
【问题讨论】:
标签: c
m[x].a[y] 的语法比 m[x][y] 更复杂,但不会在词法上添加任何内容
【讨论】:
您应该相信编译器。但是,根据您的应用,我可能会建议 2 个我知道效果很好的替代方案。
1) 使用 int a[10][10] 但确保在循环时以正确的顺序访问它们。编译器将“在下面”使用单个数组结构,以便按顺序访问
for( i = 0 ; i < 10 ; i++) {
for (j = 0 ; j < 10 ; j++) {
// do something with a[i][j]
}
}
对比
for( i = 0 ; i < 10 ; i++) {
for (j = 0 ; j < 10 ; j++) {
// do something with a[j][i]
}
}
在性能方面有所不同。后者的性能更高。
2) 选项 1 需要格外小心且违反直觉。我更喜欢这样做
int a[100]
然后做
for( i = 0 ; i < 100 ; i++)
inline_function(a[i]);
函数应该在哪里声明为内联并执行你必须做的事情。如果您可以避免该功能,那就更好了。例如,如果它是一个总和,让它 2d 或向量不会改变任何东西。
编辑:这是一个参考,详细解释了有关数组顺序的位:http://www.cplusplus.com/doc/tutorial/arrays/
【讨论】:
没有。 这是一个包含数组的结构体。
struct mat
{
int a[10];
};
你可以定义一个struct数组:
struct mat m[10];
一步到位:
struct mat{
int a[10];
}m[10];
请注意,您在 m[10] 之前有一个额外的分号,这是不正确的语法。
要访问 arr 中的元素,请使用 m[i].a[j]
这在语法上不等同于二维数组,例如:
int mat[10][10];
您可以使用mat[i][j]访问它
【讨论】: