Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在数学软件中抽象出整数类型_C++_Design Patterns_Template Meta Programming - Fatal编程技术网

C++ 如何在数学软件中抽象出整数类型

C++ 如何在数学软件中抽象出整数类型,c++,design-patterns,template-meta-programming,C++,Design Patterns,Template Meta Programming,我正在设计一个数学软件,其算法适用于一般整数类型,如机器整数或GMP整数。对于性能,人们通常希望使用机器INT,但如果出现溢出,则可能希望尝试切换到GMP;理想情况下是在运行时。到目前为止,整个程序都是作为整数类型上的模板编写的。随着图书馆的发展,痛苦也在增加: 编译时间和内存消耗正在失控 编译时的错误消息不太有用 调试更痛苦 整个代码都在头文件中 我可以想出下面的解决办法。重构代码以依赖于通过编译时宏定义类型的固定类型。然后制作库的多个副本,每个整数类型一个副本,并在可执行文件中将它们链接

我正在设计一个数学软件,其算法适用于一般整数类型,如机器整数或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或对齐的存储?