我在头文件中定义了一个哈希函数,我想确保它是内联的,但它使用了一个非常大的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,但我也有兴趣听听其他编译器如何对待它。
答案 0 :(得分:2)
正如Oli指出的那样,最好的办法是简单地查看编译器输出。但是,有些事情需要考虑:
考虑到可能出现的情况,如果您希望内联函数,最好不要在函数内部使用静态函数。但每个编译器都不同,所有类型都不相同。
编译器是否可以将此函数实际减少到编译时常量只是它是否可以内联静态的一个扩展问题。如果可以使用C ++ 11,您可能还希望查看constexpr
说明符。