C++ 如何在数学软件中抽象出整数类型
我正在设计一个数学软件,其算法适用于一般整数类型,如机器整数或GMP整数。对于性能,人们通常希望使用机器INT,但如果出现溢出,则可能希望尝试切换到GMP;理想情况下是在运行时。到目前为止,整个程序都是作为整数类型上的模板编写的。随着图书馆的发展,痛苦也在增加:C++ 如何在数学软件中抽象出整数类型,c++,design-patterns,template-meta-programming,C++,Design Patterns,Template Meta Programming,我正在设计一个数学软件,其算法适用于一般整数类型,如机器整数或GMP整数。对于性能,人们通常希望使用机器INT,但如果出现溢出,则可能希望尝试切换到GMP;理想情况下是在运行时。到目前为止,整个程序都是作为整数类型上的模板编写的。随着图书馆的发展,痛苦也在增加: 编译时间和内存消耗正在失控 编译时的错误消息不太有用 调试更痛苦 整个代码都在头文件中 我可以想出下面的解决办法。重构代码以依赖于通过编译时宏定义类型的固定类型。然后制作库的多个副本,每个整数类型一个副本,并在可执行文件中将它们链接
- 编译时间和内存消耗正在失控李>
- 编译时的错误消息不太有用
- 调试更痛苦
- 整个代码都在头文件中
换句话说,如果您使用GMP库,那么这将为您解决这些困难,并为您节省大量精力 在我自己的数学软件中,默认情况下我使用GMP,但如果它不可用,我想提供一个后备方案。我也不喜欢巨大的gmpxx头文件,这会减慢我速度较慢的机器上的编译速度 因此,我基本上在一个未定义的整数上编写了一个包装器类(pimpl使用
std::aligned_storage
)。可以在编译期间选择后端
这消除了模板,给了我足够的灵活性。不要过早地优化(Knuth)-GMP(GNU多精度算术库)非常擅长处理小的
int
s,以提高性能,并在需要时扩展到更大的。不要试图重新创造它!好吧,这不是一个不同的复杂度类,但我测量的是,当使用gmp整数而不是整数时,在同一个问题上运行的时间要长3-4倍。@Thomas,当使用标准整数时,代码做的对吗?如果“标准”代码只是一直溢出,而GMP代码必须扩展数字的内部表示以保持结果正确,这将解释差异。没有溢出。在机器整数足够的情况下,gmp使我们的速度降低了3-4倍。如果我理解正确,这基本上就是我在问题中提到的解决方案?你能详细介绍一下你的实现吗?我只需要做一堆“typedef something IntegerType”,其中一个在编译时被激活,然后在整个过程中使用IntegerType。为什么我需要pimpl或对齐的存储?