在C语言中,编译器在向量加法运算中要读取的第一个向量是什么?

在C语言中,编译器在向量加法运算中要读取的第一个向量是什么?,c,caching,memory,vector,C,Caching,Memory,Vector,我正在分析代码缓存的操作,出现了以下问题: C[i] = B[i] + A[i]; G[i] = x*F[i]; 这是代码中我有疑问的部分。上下文:我的高速缓存内存有这5个向量中最多4个的空间。它与LRU算法(最近使用的最少)配合使用,因此C、B、a和F存储时存在任何问题,但G在缓存中没有空间,因此最长时间未使用的向量将替换为G的向量值。以下是问题: A是第一个还是B?C编译器遵循什么原则来决定首先读取哪个元素?这取决于使用哪种编译器(GCC、ICC…),还是它们通常遵循相同的原则?在C[i]

我正在分析代码缓存的操作,出现了以下问题:

C[i] = B[i] + A[i];
G[i] = x*F[i];
这是代码中我有疑问的部分。上下文:我的高速缓存内存有这5个向量中最多4个的空间。它与LRU算法(最近使用的最少)配合使用,因此C、B、a和F存储时存在任何问题,但G在缓存中没有空间,因此最长时间未使用的向量将替换为G的向量值。以下是问题:


A是第一个还是B?C编译器遵循什么原则来决定首先读取哪个元素?这取决于使用哪种编译器(GCC、ICC…),还是它们通常遵循相同的原则?

C[i]=B[i]+A[i]编译器可以先加载
A[i]
或者先加载
B[i]
。C标准对本次订购没有任何要求

具有
G[i]=x*F[i]之后,编译器必须在存储
C[i]
后加载
F[i]
,除非它可以确定
F[i]
C[i]
不是同一个对象。如果可以确定,则可以按任意顺序加载
A[i]
B[i]
F[i]

类似地,如果它可以确定
G[i]
没有重叠
C[i]
,则它可以按任意顺序存储
C[i]
G[i]

如果此代码出现在循环中,这种允许的重新排序将扩展到循环迭代之间的元素:例如,如果编译器可以确定它不会影响定义的结果,那么它可以在加载当前迭代的
a[i]
之前从“未来”迭代加载
B[i]
。它可以从
B
加载四个元素,从
A
加载四个元素,从
F
加载四个元素,并在将任何元素存储到
C
G
之前执行所有算术运算。(通常,编译器没有数组重叠的必要信息,因此除非您以某种方式向它提供这些信息,例如使用
restrict
声明指针,或者使用特殊的pragma或编译器内置来告诉它这些事情,否则它不会进行这种重新排序。)


一般来说,C标准对实际操作的顺序是允许的。它只要求满足它指定的可观察行为。您不应期望仅基于标准C代码首先加载任何特定元素。

在本文中,“vector”是什么意思?上海证券交易所数组?向量数组,只是一个简单的1024长度的数组,用calloc()创建并填充了一些数据。我没有考虑这个,我认为它有一个标准。谢谢你帮助我。