我是C的新手,并且想知道哪个是更有效或更首选的方式来编程以下内容:
选项A:
#define flag
void Foo()
{
for (size_t i = 0; i < veryBigNumber; i++)
{
#if defined(flag)
doSomething1();
#endif
doSomething2();
}
}
选项B:
nump2
答案 0 :(得分:5)
除非你是一个非常古老/愚蠢的编译器,否则它们应该是等价的。
#if
保证在编译时进行评估,但是任何现代编译器都会在编译时使用整数常量评估常规if
。
(无论如何,你距离发现自己只有一步之遥。
只需在veryBigNumber
中加上一个非常大的数字,然后计算两个变体中的每一个。如果非常大的数字真的非常大(数百万,数十亿)甚至外部计时(从命令行time ./a.out
)应该给你相当可靠的时间。)
答案 1 :(得分:3)
第二个导致在未定义flag
时生成的代码较少。
重要的是,省略的代码是if
语句,因此运行时效率也会更好,因为if
语句不会被不必要地执行veryBigNumber
次。
编译器可能能够通过分析代码来优化if
语句,但明确地“ifdefing”代码将确保它是。
答案 2 :(得分:1)
这取决于。下面的代码在编译期间被完全分析,因此doSomething
将始终在运行时没有任何不必要的成本执行。上层版本在编译时扩展为if
语句;可能会在运行时评估if
条件。但是,如果激活了代码优化,编译器可能会认为if
条件永远不会为false,因此可能会删除整个if
语句。
答案 3 :(得分:1)
#define是预编译器指令。所以无论你写什么都会分析并插入代码。
例如,在您的第一个示例中,条件始终为true。编译器可能只是优化if if()条件。
同样,在第二个例子中,这是一个&#34;编译时间&#34; test(#if)不是运行时测试(如果)。
https://www.tutorialspoint.com/cprogramming/c_preprocessors.htm
使用宏可以提高性能,因为它们有助于以与函数调用类似的方式组织代码,但宏代码是&#34;内联&#34;由编译器。如果使用函数调用,这可以减少跳转到运行时所需的内存位置的开销。
它们还有助于更轻松地处理保持不变的代码。这使您的代码更易于阅读,并且编写的痛苦也更少(想象一下,每次必须使用它时都必须记住并插入一个常量值。)
答案 4 :(得分:0)
建议:
您应该使用#ifdef代替#if defined(flag)。(良好的编码实践)
和代码如:
定义:
#define FLAG
使用:
#ifdef FLAG
doSomething1();
#else
doSomething2();
#endif