Я пытаюсь понять, как побитовые операции обрабатываются компиляторами C/C++. В частности, я говорю о C, скомпилированном с gcc, но я считаю, что вопрос немного более общий, чем этот.Побитовые операции компиляции в C/C++
Во всяком случае, предположим, что у меня есть макросы, определенные следующим образом:
#define SOME_CONSTANT 0x111UL
#define SOME_OFFSET 2
#define SOME_MASK 7
#define SOME_VALUE ((SOME_CONSTANT) << (SOME_OFFSET)) & (SOME_MASK)
static inline void foo() { printf("Value: %lu#n", SOME_VALUE); }
Все ингредиенты some_value являются постоянными, и все они известны во время компиляции.
Так что мой вопрос: будет gcc оценивать SOME_VALUE во время компиляции, или это будет сделано только во время выполнения? Как проверить, поддерживает ли gcc такую оптимизацию?
Посмотрите на выход ассемблера (есть опции командной строки, которые будут делать это в gcc - '-S'). Препроцессор должен просто подставлять текст, поэтому зависит от того, оптимизирует ли компилятор то, что осталось. Должно. – sje397
Это называется «постоянная складка», и вы можете быть уверены, что любой современный компилятор сделает это во время компиляции. – Sneftel
вы, вероятно, захотите прочитать §6.6 («Константные выражения») в ИСО/МЭК 9899: 1999, в котором рассматривается это. Или, альтернативно, [этот обзор] (http://en.cppreference.com/w/c/language/constant_expression). –