繁体   English   中英

#define在C中的效率

[英]#define efficiency in C

我是C的新手,并且想知道哪个是更有效或首选的方式来编程以下内容:

选项A:

#define flag true

void Foo()
{
   for (size_t i = 0; i < veryBigNumber; i++)
   {
      if (flag)
         doSomething1();
      doSomething2();
   }
}

选项B:

#define flag

void Foo()
{
   for (size_t i = 0; i < veryBigNumber; i++)
   {
#if defined(flag)
         doSomething1();
#endif
      doSomething2();
   }
}

除非你是一个非常古老/愚蠢的编译器,否则它们应该是等价的。 #if保证在编译时进行评估,但是任何现代编译器都会在编译时使用整数常量来计算常规if


(无论如何,你只需要一步之遥就可以找到自己。只需在veryBigNumberveryBigNumber一个非常大的数字并计算两个变体中的每一个。如果非常大的数字真的非常大(数百万,数十亿)甚至计时外部(来自命令行的time ./a.out )应该给你相当可靠的时间。)

第二个导致在未定义flag时生成的代码较少。

重要的是省略的代码是if语句,因此运行时效率也会更好,因为if语句不会被不必要地执行veryBigNumber次。

编译器可能能够通过分析代码来优化if语句,但显式地“ifdefing”代码将确保它是。

这取决于。 下面的代码在编译期间被完全分析,因此doSomething将始终在运行时没有任何不必要的成本执行。 上层版本在编译时扩展到if语句; if条件可能会在运行时进行评估。 但是,如果激活了代码优化,编译器可能会决定if条件永远不会为false,因此可能会删除整个if语句。

#define是一个预编译器指令。 所以无论你写什么,都会分析并插入代码。

例如,在您的第一个示例中,条件始终为true。 编译器可能只是优化if if()条件。

同样,对于第二个示例,这是“编译时间”测试(#if)而不是运行时测试(如果)。

https://www.tutorialspoint.com/cprogramming/c_preprocessors.htm

使用宏可以提高性能,因为它们有助于以与函数调用类似的方式组织代码,但宏代码由编译器“内联”。 如果使用函数调用,这可以减少跳转到运行时所需的内存中的位置的开销。

它们还有助于更轻松地处理保持不变的代码。 这使得您的代码更易于阅读并且编写起来更少痛苦(想象一下,每次必须使用它时都必须记住并插入常量值)。

建议:

您应该使用#ifdef代替#if defined(flag)。(良好的编码实践)

和代码如下:

限定:

 #define FLAG

采用:

#ifdef FLAG
     doSomething1();
#else
    doSomething2();
#endif

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM