超出cstint的数值类型

Numerical types beyond cstdint

本文关键字:类型 cstint 超出      更新时间:2023-10-16

我一直在使用类型从cstdint(如uint32_t)在我的代码定期,但现在他们不太适合我的需要,特别是关于模板。

是否有一种方法可以指定一个是模板实参大小的两倍的整数类型?当我的模板传递一个uint32_t时,我需要它为函数中的一个变量创建一个uint64_t。也许更困难的是,当传递uint64_t时,我需要它来创建一个"uint128_t"。我可以用包含两个模板参数的数组来做这件事,但是我不能把这个数组传递给其他模板函数。这是代码的性能关键部分(我正在做加密)。

与此相关,是否有一些其他的头,我可以包括(按优先顺序:标准,boost,其他),给我128位整数?看起来这个问题回答了这个特殊的部分:最快的128位整数库

是否有一种方法可以指定我要使用不大于特定大小的最大整数?这个最大尺寸也是sizeof (T)的函数。

"扩展算术"是C语言家族的一个缺点。没有办法获得处理器的整数溢出标志,因此没有可移植的方法来编写最佳的128位整数类。

为了获得最佳性能(与其他加密库竞争),您可能需要一个包含自定义程序集的静态库。不幸的是,我不知道有一个可移植的(广泛移植的)接口。

如果你只想要一个从N位的基本类型到2N位的基本类型的映射,那么创建一个简单的元函数:

template< typename half >
struct double_bits;
template<>
struct double_bits< std::uint8_t >
    { typedef std::uint16_t type; };
template<>
struct double_bits< std::uint16_t >
    { typedef std::uint32_t type; };
template<>
struct double_bits< std::uint32_t >
    { typedef std::uint64_t type; };