Optimization 预处理器标志与(例如)布尔标志

Optimization 预处理器标志与(例如)布尔标志,optimization,coding-style,preprocessor,flags,Optimization,Coding Style,Preprocessor,Flags,我正在熟悉一套科学的流体力学代码。代码几乎总是使用预处理器指令,例如 #ifdef PARTICLES int nghost = 5 #else int nghost = 4 #endif 而不是简单的C标志,比如 int nghost = 4; if( particlesFlag ) { nghost = 5; } 预处理器标志的缺点是(在这个框架中),它需要在每次构建之前对每个问题设置进行配置(创建头文件),而使用c代码标志只需要重新编译 这种方法的优点是什么? 效率的任

我正在熟悉一套科学的流体力学代码。代码几乎总是使用预处理器指令,例如

#ifdef PARTICLES
    int nghost = 5
#else
    int nghost = 4
#endif
而不是简单的C标志,比如

int nghost = 4;
if( particlesFlag ) { nghost = 5; }
预处理器标志的缺点是(在这个框架中),它需要在每次构建之前对每个问题设置进行配置(创建头文件),而使用c代码标志只需要重新编译

这种方法的优点是什么?


效率的任何提高似乎都是难以置信的小——特别是因为(例如)当程序初始化时,这段代码只运行一次,而所有真正的工作都是在不同处理器之间的循环中进行的,等等。

说我有数千个使用nghost的API。如果已经定义了粒子,那么在预处理过程中,所有这些变量都将被5替换为4

您所说的是单个实例,一个大型项目中的预处理非常有用

想想这个

int x() { int a = nghost *5; }
int ab() { return (nghost+10); }
每次使用时,其运行时消耗

int x() { 
int a;
int nghost = 4;
if( particlesFlag ) { nghost = 5;}
a=nghost*5;
}


int ab() { 
int nghost = 4;
if( particlesFlag ) { nghost = 5;}
return (nghost+10); 
}

等等

再想想这个

int x() { int a = nghost *5; }
int ab() { return (nghost+10); }
假定

#ifdef PARTICLES
int nghost = 5
int aghost = 5
int bghost = 5
int cghost = 5
int dghost = 5
int eghost = 5
int fghost = 5
#else
int nghost = 4
int aghost = 4
int bghost = 4
int cghost = 4
int dghost = 4
int eghost = 4
int fghost = 4
#endif

谢谢你的回复,但我有点困惑。在我给出的示例中,您可以将第一个转换为
int nghost=5
(如果定义了
粒子
)。因此,这两个示例之间的唯一区别在于是否在代码执行期间执行
if…else…
语句,对吗?当您说if和else时,它是在运行时执行的,也就是说,您的程序应该是快速的。预处理是在编译时,甚至在编译之前进行的。对,我明白了。我不明白为什么在这两种情况下访问变量(
nghost
)是不同的。也就是说,如果通过预处理器和代码中定义了
nghost
,那么
int x(){int a=nghost*5;}
会有什么不同?运行时与编译时不同。更多澄清请参见我的答案。每次,你都要做一个if检查,而在预处理中,if只是一个算术运算。如5*5或4*5
nghost
仅定义一次。无论上述两种实现如何,
nghost
的每次使用都应该是相同的,对吗?