2012-02-12 1 views
0

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

Пример:

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

Спасибо!

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

+0

Это будет зависящим от компилятора. Вы можете взглянуть на код ассемблера, который генерирует ваш компилятор. –

+2

Template meta programming выполнит эту работу, если ваш оптимизатор вашего компилятора не оценит pow во время выполнения –

+0

@DavidHeffernan - шаблон мета-программирования? Я должен буду изучить это. Эти макросы используются в нескольких циклах, и вызов pow() будет довольно напряженным. – Qix

ответ

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

Функция, как вы можете видеть, даже не называется. Таким образом, возможно, что вызов отменяется навсегда.

+0

Это очень хорошо отвечает на мой вопрос. Мне придется играть с vs2008, чтобы понять, как получить результат, но я не думал об этом вообще! – Qix

+1

@ Di-0xide во время отладки, щелкните правой кнопкой мыши и выберите «show dissasembly» –

1

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

#define POW1(x) (x) 
#define POW2(x) ((x)*(x)) 
#define POW3(x) (POW2(x)*POW1(x)) 
... 
#define POW(x, y) POW##y(x) 
+0

Ну, конечно, но это было просто любопытство, которое у меня было. – Qix

+2

Если 'x' не является постоянным выражением, это потенциально * намного хуже *, чем оптимизированная интегральная функция мощности! –

0

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

+1

Возможно, ваш ответ отсутствует в финальной части? ;) – bluish