2016-06-13 5 views
1

Я занимаюсь программированием на шахматы в C++, в результате есть множество поразрядных операций, которые я должен делать с некоторыми большими числами. Мне было интересно, ради успеха, если во время выполнения выполняются постоянные операции? Или, если они оцениваются во время компиляции. например Предположим, что я должен и следующие 2 константы:Выполняются постоянные операции константы во время выполнения?

const unsigned long long FILE_A = ~0x8080808080808080; 
const unsigned long long FILE_B = ~0x4040404040404040; 

В функции как этот

unsigned long long join(){ 
    return (FILE_A & FILE_B); 
} 

ли операция И на FILE_A и FILE_B сделано во время выполнения? Или компилятор делает это?

+3

Попробуйте и проверьте сборку сгенерированный компилятором –

ответ

3

В целом: компилятору C++ разрешено выполнять любую оптимизацию, пока результат оптимизации «как будто» код был выполнен буквально.

В примере, который вы указали, выполнение данного расчета во время компиляции неотличимо от его выполнения во время выполнения; поэтому современные компиляторы C++ будут делать именно это. На самом деле, современные компиляторы C++, если join() определен в файле заголовка (с атрибутом inline) - и если выбран умеренный уровень оптимизации - он не только сделает вычисление во время компиляции, но и полностью оптимизирует join(), и впрыскивать вычисленную константу напрямую, где используется join(), что делает возможной дополнительную оптимизацию времени компиляции. Это потому, что результат будет неотличим от результата, если ничего не было оптимизировано.

+0

Ahh, я вижу, да, соединение имеет смысл, но это был всего лишь пример. Спасибо за ответ! –

1

Из-за внешнего вида вещей. Я положил свой код, тот выше в этом преобразователе https://assembly.ynh.io/ и линии return (FILE_A & FILE_B); выводит следующую сборку

movabsq $4557430888798830399, %rax 

И да, 4557430888798830399 является побитовое и (~0x8080808080808080) и (~0x4040404040404040)

Смежные вопросы