[英]#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
。
(无论如何,你只需要一步之遥就可以找到自己。只需在veryBigNumber
中veryBigNumber
一个非常大的数字并计算两个变体中的每一个。如果非常大的数字真的非常大(数百万,数十亿)甚至计时外部(来自命令行的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.