Статические переменные во встроенной функции - PullRequest
3 голосов
/ 16 октября 2011

У меня есть хеш-функция, определенная в заголовочном файле, и я хочу убедиться, что она встроена, но она использует очень большой константный статический буфер целых чисел.Мне интересно, повлияет ли этот буфер на способность функции быть встроенной.Вот код (он основан на реализации crc32, найденной здесь ).

inline HashId hash(const void *value, const size_t length,
   const HashId previous = 0)
{
   // Here is the really large const static buffer.
   static const unsigned int crcTable[256] = { /* 256 Unique ints */ };

   // Short hash calculation
   unsigned char *cast = (unsigned char*) value;
   unsigned int crc32 = previous ^ 0xFFFFFFFF;
   for (size_t i = 0; i < length; ++i)
   {
      crc32 = (crc32 >> 8) ^ crcTable[ (crc32 ^ cast[i]) & 0xFF];
   }
   return (crc32 ^ 0xFFFFFFFF);
}

Я надеюсь, что если ввод известен во время компиляции, то этот вызов получитскомпилировано в одно значение.Это ожидает слишком много от компилятора?Я компилирую с gcc 4.6 с -O2, но мне также интересно услышать, как другие компиляторы могли бы относиться к этому.

1 Ответ

2 голосов
/ 16 октября 2011

Как указывает Оли, лучше всего просто посмотреть на результаты компиляции.Однако вот несколько вещей, которые следует учитывать:

  • Если содержимое статического константы действительно постоянное, вам будет лучше поместить его в анонимное пространство имен.Это гарантирует, что его инициализация не имеет ничего общего с вызовом функции.
  • тип статического.Ваш пример довольно тривиален и поэтому, вероятно, будет в порядке, но другие типы будут другими.Обратите внимание, что инициализация такой статики может или должна быть отложена до тех пор, пока не будет введен блок (если вы хотите, загляните в стандарт на 6.7)
  • Многопоточность, относящаяся к предыдущей, для инициализации может потребоваться использованиемьютекс, чтобы предотвратить инициализацию нескольких потоков.

Учитывая возможные сценарии, было бы лучше, чтобы в вашей функции не было статики, если вы хотите, чтобы она была встроенной.Но каждый компилятор различен, и все типы не равны.

Может ли компилятор фактически свести эту функцию к константе времени компиляции, это просто расширенный вопрос, может ли он вообще включать статическую функцию.Вы также можете посмотреть спецификатор constexpr, если можете использовать C ++ 11.

...