c - 确定基本算术计算最快的无符号整数类型

标签 c

我正在编写一些代码来计算任意大的无符号整数。这只是为了娱乐和训练,否则我会使用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/

相关文章:

c - vgetq_lane_u64(x, 0) 与 vget_low_u64(x)

c - C语言中如何对链表进行排序

python - 将数组从 c 传输到 python

检查 C 中包含 undefined variable 的关系表达式的有效性

c - 为三维数组动态分配内存

c - Nanopb 从 pb_ostream_t 获取字符串

c++ - 隐藏内存分配?

c - 为什么在这个程序中出现段错误

c++ - 在嵌入式系统上将数组排序函数从 C++ 移植到 C

python - python 如何支持字符串中的空字符?