C ++编译器是否基于模板参数优化模板方法?

时间:2014-12-01 02:11:53

标签: c++ templates

C ++编译器是否能够以具体方法实现(if (little_endian) => if(true)if(false))仅包含相关代码的方式优化此类代码需要使用type_traits并提供两个单独的实现,以确保我的代码将被优化(即没有分支预测)?

template <typename T, bool little_endian = true> bool readValue(T& value)
{
    if (m_num_bytes_parsed + sizeof(value) <= m_num_bytes_total)
    {
        if (little_endian)
        {
            m_file_stream.read((char *)(&value), sizeof(value));                    
        }
        else
        {
            char bytes[sizeof(T)];
            m_file_stream.read((char *)(&value), sizeof(value));
            std::reverse(bytes, bytes + sizeof(value));
            memcpy(&value, bytes, sizeof(T));
        }
        m_num_bytes_parsed += sizeof(value);
        return true;
    }
    return false;
}

1 个答案:

答案 0 :(得分:2)

是的,每个编译器都会优化if(true)if(false),否则会折叠简单的常量表达式。

可能有一些模糊不清的编译器无法做到这一点。明确地说,当前版本的gcc,clang,intel和msvc都会根据我的知识这样做,而且我没有遇到过不这样做的编译器。