内联函数中的静态变量

时间:2011-10-16 11:12:46

标签: c++ static inline

我在头文件中定义了一个哈希函数,我想确保它是内联的,但它使用了一个非常大的const静态缓冲区。我想知道这个缓冲区是否会影响函数内联的能力。这是代码,(它基于找到here的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 个答案:

答案 0 :(得分:2)

正如Oli指出的那样,最好的办法是简单地查看编译器输出。但是,有些事情需要考虑:

  • 如果静态的内容真的是常量,那么最好将它放在匿名命名空间中。这确保了它的初始化与调用函数无关。
  • 静态的类型。你的例子非常简单,因此可能会很好,但其他类型会有所不同。请注意,此类静态的初始化可能或必须是 延迟到阻止输入(如果你想要的话,通过6.7的标准拼图)
  • 多线程,与之前的初始化相关,可能需要使用互斥锁来防止多个线程进行初始化。

考虑到可能出现的情况,如果您希望内联函数,最好不要在函数内部使用静态函数。但每个编译器都不同,所有类型都不相同。

编译器是否可以将此函数实际减少到编译时常量只是它是否可以内联静态的一个扩展问题。如果可以使用C ++ 11,您可能还希望查看constexpr说明符。