简单的问题:当编译器面临一个调用,比如说,带有两个常量(即来自宏的值)的 pow() 时,它是通过在编译时评估它来优化的,还是仍然在运行时计算?
例子:
#define V_BITMEM_GRID 3
#define V_BITMEM_TOTAL pow(V_BITMEM_GRID,2)
谢谢!
编辑如果没有,有没有办法在编译时将宏的平方/立方体计算为另一个宏(就像我在上面尝试的那样)?
简单的问题:当编译器面临一个调用,比如说,带有两个常量(即来自宏的值)的 pow() 时,它是通过在编译时评估它来优化的,还是仍然在运行时计算?
例子:
#define V_BITMEM_GRID 3
#define V_BITMEM_TOTAL pow(V_BITMEM_GRID,2)
谢谢!
编辑如果没有,有没有办法在编译时将宏的平方/立方体计算为另一个宏(就像我在上面尝试的那样)?
两者都可以。这取决于编译器的侵入性,它是否可以访问函数实现并可以正确评估它。只要观察到的行为是相同的,就没有规定它应该如何的规则。
例如,我得到以下信息:
#define X 1
#define Y 2
int foo(int x, int y)
{
return x + y;
}
int main(int argc, char* argv[])
{
cout << foo(X,Y);
00BE1000 mov ecx,dword ptr [__imp_std::cout (0BE203Ch)]
00BE1006 push 3
00BE1008 call dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (0BE2038h)]
}
如您所见,该函数甚至没有被调用。因此,呼叫有可能被永久消除。
你不应该依赖它。基于宏的方法是:
#define POW1(x) (x)
#define POW2(x) ((x)*(x))
#define POW3(x) (POW2(x)*POW1(x))
...
#define POW(x, y) POW##y(x)
gcc 在编译时计算这样的表达式,例如