超出cstdint的数字类型

时间:2011-11-30 18:18:53

标签: c++ templates integer c++11

我经常在我的代码中使用cstdint中的类型(例如uint32_t),但现在它们不太适合我的需求,特别是在模板方面。

有没有办法指定一个两倍于模板参数大小的整数类型?当我的模板传递给uint32_t时,我需要它为函数中的一个变量创建一个uint64_t。也许更难的是,当通过uint64_t时,我需要它来创建一个'uint128_t'。我可以使用两个模板参数的数组来完成此操作,但是我无法将该数组传递给其他模板函数。这是性能关键的代码部分(我正在进行加密)。

与此相关,是否有一些我可以包含的标题(按优先顺序:标准,升压,其他)给出了128位整数?看起来这个问题回答了这一特定部分:Fastest 128 bit integer library

有没有办法指定我想使用不大于特定大小的最大可用整数?这个最大尺寸也是sizeof(T)的函数。

1 个答案:

答案 0 :(得分:5)

“扩展算术”是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; };