【问题标题】:Which one takes less Execution time and why? [closed]哪一个需要更少的执行时间,为什么? [关闭]
【发布时间】:2018-03-23 07:03:05
【问题描述】:
1. 
int main() { int a; a = 0; }
//OR 
2. 
#define ZERO 0 int main() { int a; a = ZERO; }

我认为第二个执行时间更少,因为它是预处理的。

【问题讨论】:

  • 他们是平等的。基本C.
  • 首先,构建两个启用优化的程序。然后比较两者的生成代码。如果(我的意思是如果)它们不同,那么测量。
  • @Someprogrammerdude 第二个只是一个定义,它将在预处理器中替换。这里没有区别。
  • @Someprogrammerdude 是正确的。如果chandan真的有兴趣,他应该做这个实验。
  • 两者都被优化为一个没有内容的空 main() 函数......在你学习了 C 的基础知识并参加了基本的算法课程之前,不要担心优化。

标签: c compilation preprocessor


【解决方案1】:

唯一的一条 - 编译时间和执行时间完全是不同的指标!!

任何以中高级语言编写的程序都不会按原样由系统执行。对于 C,它是编译器,它将源文件作为输入并生成二进制文件(机器可执行代码)。在这个过程中,它对代码进行了很多优化

在这种情况下,编译器很可能会完全优化语句,因为它们没有使用有意义。两个 sn-ps 都可能生成 same 二进制文件(除非您强行关闭优化)。如果有的话,您必须检查生成的二进制文件并执行时间测量以检查最终结果。

【讨论】:

  • 它是预处理器,它不会达到优化步骤。
  • @WedaPashi 在回复之前我没有检查太多声誉。 :D
  • @WedaPashi 好吧,我们不讨论代表,这与内容无关。 Afshin - 将完成预处理,无论如何都不会在执行时间中考虑。最后,优化将在生成二进制文件之前启动,这与执行时间有直接关系。希望现在清楚了。
  • @SouravGhosh 但是替换预处理器不被认为是编译器的优化步骤,不是吗?该术语通常用于将编译器的中间语言改进为最终的可执行代码。这就是我评论你的回复的原因。
  • @Afshin 明白了,但这个问题是从执行时间的角度提出的。 :)
【解决方案2】:

他们是平等的。编译器的预处理器只是在做任何事情之前替换ZERO

假设它是这样写的:

#define ZERO 0 
int main() { int a; a = ZERO; }

程序将被转换为

int main() { int a; a = 0; }

在编译之前,它不会达到优化步骤。

更新: 澄清一下,有时你会看到这样的代码:

#define ERROR_MEMORY_ALLOCATION_FAILED -1

char *buf = malloc(10);
if (!buf)
    return ERROR_MEMORY_ALLOCATION_FAILED;

这可以大大提高代码的可读性,尤其是当您重用这些定义时。

【讨论】:

  • 但是我在大多数人身上看到过大代码中的第二个。
  • @chandan 它是为了使代码更具可读性,并为某些值使用一些有意义的术语。如果使用得当,它会使代码更具可读性。
  • @chandan 自己回答一下为什么首先需要预处理器?还有int a = 0;是人们最常使用的。
  • 非常感谢您为我解惑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-09
  • 1970-01-01
相关资源
最近更新 更多