c - 哪种使用 C 数组的数据组织可以生成最快的代码,为什么?

标签 c arrays pointers data-structures struct

根据以下数据,组织元素数组以便实现最快随机访问的最佳方法是什么?

每个元素都有一些 int 数字、一个以 '\0' 结尾的 3 个字符的名称和一个浮点值

我看到两种可能的方法来组织和访问此类数组:

第一:

typedef struct { int num; char name[4]; float val; } t_Element;
t_Element array[900000000];
//random access:
num = array[i].num;
name = array[i].name;
val = array[i].val;
//sequential access:
some_cycle:
  num = array[i].num
  i++;

第二:

#define NUMS 0
#define NAMES 1
#define VALS 2
#define SIZE (VALS+1)
int array[SIZE][900000000];
//random access:
num = array[NUMS][i];
name = (char*) array[NAMES][i];
val = (float) array[VALS][i];
//sequential access:
p_array_nums = &array[NUMS][i];
some_cycle:
  num = *p_array_nums;
  p_array_nums++;  

我的问题是,什么方法更快,为什么?我的第一个想法是第二种方法可以生成最快的代码并允许最快的 block 复制,但我怀疑与第一种方法相比它是否可以节省敏感数量的 CPU 指令?

最佳答案

这取决于常见的访问模式。如果您计划迭代数据,随时访问每个元素,则 struct 方法更好。如果您计划独立迭代每个组件,那么并行数组会更好。

这也不是一个微妙的区别。由于主内存通常比 L1 缓存慢两个数量级,因此使用适合使用模式的数据结构可能会使性能提高三倍。

不过,我必须说,您实现并行数组的方法还有很多不足之处。您应该简单地声明三个数组,而不是使用二维数组和转换来“聪明”:

int nums[900000000];
char names[900000000][4];
float vals[900000000];

关于c - 哪种使用 C 数组的数据组织可以生成最快的代码,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5323154/

相关文章:

c - 目标文件中 .bss 部分的必要性是什么?

c - C语言中的最小值和最大值

arrays - 为什么 slice 变量在一遍又一遍地分配时不会被覆盖?

c++ - 什么决定了调用 delete 时写入 C++ 指针的内容?

c++ - 字符、指针、强制转换和字符串问题

c++ - 重新检查时指针属性发生变化

c - 使用 Fork 的递归斐波那契数列(C 语言)

c - 按位补码运算符返回的数据类型是什么?

PHP 内部数组

c - 最小值和最大值不是数组中的数字