我正在编写一些非常紧密的循环,最外面的循环将运行一个多月。我的理解是函数的局部变量越少,编译器就越能优化它。在其中一个循环中,我需要一些标志,一次只使用其中一个标志。如果你是知道我住在哪里的众所周知的杀人疯子,你宁愿拥有一个名为flag
的旗帜并在整个过程中使用,或者你更喜欢像
unsigned int flag;
while (condition) {
#define found_flag flag
found_flag = 0;
for (i = 0; i<n; i++) {
if (found_condition) {
found_flag = 1;
break;
}
}
if (!found_flag) {
/* not found action */
}
/* other code leading up to the next loop with flag */
#define next_flag flag
next_flag = 0;
/* ... /*
}
这提供了允许每个标志的描述性名称而不添加新变量但看起来有点不正统的好处。我是一名新的 C 程序员,所以我不知道该怎么做。
答案 0 :(得分:14)
不要打扰这样做,只需为每个标志使用一个新变量。编译器将能够确定每个首先和最后使用的位置,并相应地优化实际使用的空间量。如果标志变量的使用都没有重叠,那么编译器最终可能会为所有标志变量使用相同的空格。
首先是可读性代码。
答案 1 :(得分:3)
我完全赞同dreamlax: the compiler will be smart enough让你完全忽略这个问题,但我想提一下你忽略了第三个选项,它更具可读性:
while (something) {
/* setup per-loop preconditions */
{
int flag1;
while (anotherthing) {
/* ... */
}
/* deal with flag found or not-found here */
}
/* possibly some other preconditions */
{
int flag2;
while (stillanotherthing) {
/* ... */
}
}
}
当你完成每个标志时,它会告诉一个哑编译器显式地 。请注意,您需要注意声明需要超出标志范围块的变量的位置。
答案 2 :(得分:3)
你的技巧只对那些无法正确注册(重新)分配和调度的非常古老,非常简单或错误的编译器有用(有时候,这是各种或古老的嵌入式处理器所困扰的)。 gcc和大多数现代编译器在启用优化时会重新分配用于局部变量的任何寄存器或本地内存资源,直到在机器代码级别调试时几乎难以找到它们。所以你不妨让你的代码可读,而不是在这种类型的过早优化上花费大脑力量。