2011-11-30 27 views
4

我一直在我的代码中定期使用cstdint中的类型(例如uint32_t),但现在它们不太适合我的需求,特别是关于模板。超越cstdint的数字类型

有没有一种方法来指定一个整型,它是模板参数大小的两倍?当我的模板传递一个uint32_t时,我需要为函数中的一个变量创建一个uint64_t。也许更困难的是,当传递一个uint64_t时,我需要它创建一个'uint128_t'。我可以用两个模板参数的数组来做到这一点,但是我无法将该数组传递给其他模板函数。这是代码的性能关键部分(我正在做密码学)。

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

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

+0

此之前已经讨论,搜索这个网站,你会发现一些有用的东西。 –

+0

你需要什么128位整数? –

+0

相关:http://stackoverflow.com/questions/1188939/representing-128-bit-numbers-in-c –

回答

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; }; 
+0

模板类+1。我的思想被卡在模板函数中,我试图找出如何让函数返回一个类型而不是一个值。搜索只会给我一些关于函数返回类型的东西,而不是从函数返回一个类型。 –

+0

@David:具体来说,这些类被称为_metafunctions_。搜索这个词会产生一些很好的阅读材料。 : - ] – ildjarn

+0

我有类似的float - > double - > long double,我用它来提高浮点数值的精度。我觉得它很有用。 – emsr