Boost C++ 库

……世界上最受推崇且设计最专业的 C++ 库项目之一。 Herb SutterAndrei Alexandrescu,《C++ 编码规范

优化 CRC 计算器 - Boost C++ 函数库
PrevUpHomeNext
#include <boost/cstdint.hpp>  // for boost::uintmax_t
#include <cstddef>            // for std::size_t

namespace boost
{
    template < std::size_t Bits, uintmax_t TruncPoly, uintmax_t InitRem,
     uintmax_t FinalXor, bool ReflectIn, bool ReflectRem >
    class crc_optimal;
}

boost::crc_optimal 类模板作为一个非增强型 CRC 处理器,可以接收字节级的输入。它将所有 Rocksoft™ 模型 CRC 算法参数作为模板参数。与 crc_basic 一样,WIDTH(宽度)保持为第一个参数,并决定了用于除法寄存器的内置无符号整数类型。其他的 Rocksoft™ 模型 CRC 算法参数移至模板参数字段中,且保持与它们在 crc_basic 构造函数中相同的相对顺序。(某些参数具有默认值。)基于 crc_optimal 的对象既可以进行默认构造(表现与具有相同设置的 crc_basic 对象一致),也可以使用单参数进行构造,该参数会覆盖初始余数值[2],但不会永久改变初始余数属性。

除了模板参数和构造方式外,crc_optimal 在接口方面与 crc_basic 的区别在于:

  • 添加了五个与新模板参数对应的类静态不可变数据成员。

    表 9.3. boost::crc_optimal 中的额外 RMCA 表达式

    新成员

    等效项

    truncated_polynominal

    get_truncated_polynominal

    initial_remainder

    get_initial_remainder

    reflect_input

    get_reflect_input

    reflect_remainder

    get_reflect_remainder

    final_xor_value

    get_final_xor_value


  • 移除了 process_bitprocess_bits 成员函数。
  • 添加了两个版本的 operator () 成员函数。单参数版本转发给 process_byte,使其适用于接受(并可能返回)函数对象的 STL 算法[3]。无参版本转发给 checksum,使其适用于需要生成器对象的 STL 算法[4]
  • 将两个 reset 成员函数合并为一个。(它使用一个可以带有默认参数的单个参数。)

crc_basiccrc_optimal 之间的主要区别在于内部实现。crc_basic 的对象无论输入使用何种单位,其 CRC 算法都是逐位运行的。而 crc_optimal 的对象,当 WIDTH 至少为 CHAR_BIT[5] 时,会使用基于字节索引的查表法 CRC 算法,这比逐位处理要快得

由于所有参数均在编译时指定,因此您无法重用同一个计算器对象来运行参数不同的程序。该类型使用自动定义的复制/移动/赋值和析构例程。



[2] 即在读取任何输入之前的中间余数。

[3] 例如 std::for_each

[4] 尽管在该对象仅用作生成器的代码中,其返回值不会发生改变。

[5] 即,如果 WIDTH 仅能证明使用单个字节的一部分,则优化会被挂起。


PrevUpHomeNext