0

前几天,我正在将一个用 C99 标准编写的程序转换为 C11。基本上,动机是将代码与 MSVC 一起使用,但它是用 Linux 编写的,主要是使用默认的 GCC 行为编译的。在代码转换过程中,我发现不能在任何语句之后对函数的变量进行 decalre,即必须在函数顶部声明它们。

但是我的问题是,应该在使用附近声明变量以最大化缓存命中率,这是否违反了有效的编程规则?例如,在 200 LOC 的大型函数中,我想在函数末尾使用一些大型静态查找数组。不会在使用导致更多缓存命中之前声明和初始化它吗?还是我简单地错过了 C11 C 语言标准的一些基本点?

4

2 回答 2

4

您似乎对正在编译程序的标准版本有些困惑。AFAIK,MSVC 不支持任何最新的 C 标准。

但是要谈到您问题的核心,不,这不是效率问题。只要程序的可观察行为没有改变,编译器就可以根据自己的喜好对语句重新排序。因此,现代编译器总是会在首次使用之前尽可能晚地触及新变量。

于 2012-10-15T15:46:07.260 回答
2

变量声明出现的位置对缓存行为没有影响。只是有一个声明不会触及记忆。

但是,您可能需要将初始化分离到一个单独的分配中,以确保您没有初始化程序导致在函数开始处(附近)进行内存访问。

于 2012-10-15T15:46:07.900 回答