C ++: pow () оптимизация с двумя константами - PullRequest
0 голосов
/ 12 февраля 2012

Простой вопрос: когда компилятор сталкивается с вызовом, скажем, pow () с двумя константами (то есть значениями из макросов), оптимизируется ли он, оценивая его во время компиляции, или он все еще вычисляется во время выполнения?

Пример:

#define V_BITMEM_GRID 3
#define V_BITMEM_TOTAL pow(V_BITMEM_GRID,2)

Спасибо!

EDIT Если нет, есть ли способ вычислить квадрат / куб макроса как другой макрос (как я пытался выше) во время компиляции?

Ответы [ 3 ]

2 голосов
/ 12 февраля 2012

Это может быть и другое. Это зависит от того, насколько навязчивым является компилятор, имеет ли он доступ к реализации функции и может правильно ее оценить. Нет правила, определяющего, каким оно должно быть, при условии, что наблюдаемое поведение одинаково.

Например, я получил следующее:

#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)] 
}

Функция, как видите, даже не вызывается. Так что вполне возможно, что звонок исключен навсегда.

1 голос
/ 12 февраля 2012

Ты не должен зависеть от этого.Подход на основе макросов:

#define POW1(x) (x)
#define POW2(x) ((x)*(x))
#define POW3(x) (POW2(x)*POW1(x))
...
#define POW(x, y) POW##y(x)
0 голосов
/ 12 февраля 2012

gcc считает такие выражения во время компиляции, например

...