我正在编写一些代码来计算任意大的无符号整数。这只是为了娱乐和训练,否则我会使用libgmp。我的表示使用无符号整数数组,为了选择“基本类型”,我使用 typedef:
#include <limits.h>
#include <stdint.h>
typedef unsigned int hugeint_Uint;
typedef struct hugeint hugeint;
#define HUGEINT_ELEMENT_BITS (CHAR_BIT * sizeof(hugeint_Uint))
#define HUGEINT_INITIAL_ELEMENTS (256 / HUGEINT_ELEMENT_BITS)
struct hugeint
{
size_t s; // <- maximum number of elements
size_t n; // <- number of significant elements
hugeint_Uint e[]; // <- elements of the number starting with least significant
};
代码工作正常,所以我在这里只显示与我的问题相关的部分。
我想选择一个比 unsigned int
更好的“基本类型”,这样计算在目标系统上可能是最快的(例如,当目标为 x86_64 时选择 64 位类型,当目标为 32 位类型时) i686,针对 avr_attiny 时的 8 位类型,...)
我认为 uint_fast8_t
应该做我想做的事。但我发现事实并非如此,参见例如这是来自 MinGW 的 stdint.h
的相关部分:
/* 7.18.1.3 Fastest minimum-width integer types
* Not actually guaranteed to be fastest for all purposes
* Here we use the exact-width types for 8 and 16-bit ints.
*/
typedef signed char int_fast8_t;
typedef unsigned char uint_fast8_t;
评论很有趣:在 win32 上,unsigned char
出于什么目的会比 unsigned int
更快?嗯,重要的是:uint_fast8_t
不会做我想做的事。
那么有没有一些好的且可移植的方法来找到最快的无符号整数类型?
最佳答案
这并不是那么黑白分明;处理器可能具有用于某些操作的不同/专用寄存器,例如 x86_64 上的 AVX 寄存器,可能在半大小寄存器上最有效地运行,或者根本没有寄存器。因此,“最快整数类型”的选择在很大程度上取决于您需要执行的实际计算。
话虽如此,C99 定义了 uintmax_t
,它旨在表示最大宽度无符号整数类型,但要注意,它可能是 64 位,因为编译器能够模拟 64 位数学。
如果您的目标是商用处理器,size_t
通常会为底层硬件的“位数”提供良好的近似值,因为它直接与处理器的内存寻址能力相关。机器,因此最有可能是整数数学的最佳大小。
无论如何,您都必须在您计划支持的所有硬件上测试您的解决方案。
关于c - 确定基本算术计算最快的无符号整数类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44385300/