它似乎uint32_t比uint_fast32_t(我意识到这是轶事证据)更普遍.但这对我来说似乎是违反直觉的.
几乎总是当我看到一个实现使用时uint32_t,它真正想要的是一个整数,它可以容纳高达4,294,967,295的值(通常在65,535和4,294,967,295之间的某个更低的界限).
这似乎很奇怪uint32_t,因为不需要"正好32位"保证,并且"最快可用> = 32位"保证uint_fast32_t似乎是正确的想法.而且,虽然它通常是实现的,uint32_t但实际上并不能保证存在.
那么,为什么会更uint32_t受青睐?是简单地知道还是比其他技术有优势?
我已经下载了MinGW-64,所以我现在可以使用g ++ 4.7.0(实验性)编译适用于Windows 7的64位程序.但是以下行:
cout << sizeof(long) << " " << sizeof(void*) << endl ;
Run Code Online (Sandbox Code Playgroud)
打印4 8,而不是8 8.g ++ 4.6.0的文档说:
64位环境将int设置为32位,将long设置为64位
有谁知道为什么sizeof(long)不是8?
编辑添加:我的困惑的来源是64位Windows的g ++ 4.7.0(还)是GNU编译器集合的官方部分.它是第一个带有32位的64位版本long,因此文档根本不适用于它.实际上,如果您访问相关网页,IA-32/x86-64的完整条目包括:
...
关于uint_fast*_t类型族,C标准还不太清楚.在gcc-4.4.4 linux x86_64系统上,类型uint_fast16_t和uint_fast32_t大小均为8个字节.但是,8字节数的乘法似乎比4字节数的乘法慢得多.以下代码演示了:
#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>
int
main ()
{
uint_least16_t p, x;
int count;
p = 1;
for (count = 100000; count != 0; --count)
for (x = 1; x != 50000; ++x)
p*= x;
printf("%"PRIuLEAST16, p);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我得到了在程序上运行time命令
real 0m7.606s
user 0m7.557s
sys 0m0.019s
Run Code Online (Sandbox Code Playgroud)
如果我将类型更改为uint_fast16_t(和printf修饰符),则时间变为
real 0m12.609s
user 0m12.593s
sys 0m0.009s
Run Code Online (Sandbox Code Playgroud)
那么,如果stdint.h头文件uint_fast16_t(以及uint_fast32_t)定义为4字节类型,那会不会更好?
的X32 ABI指定,除其他事项外,对于x86_64体系生成的代码32位指针。它结合了 x86_64 架构(包括 64 位 CPU 寄存器)的优点和 32 位指针减少的开销。
的<stdint.h>报头定义的typedef int_fast8_t,int_fast16_t,int_fast32_t,和int_fast64_t(和相应的无符号类型uint_fast8_t等人)中,其中的每一个是:
在所有至少具有指定宽度的整数类型中,通常操作最快的整数类型
附注:
不能保证指定的类型在所有用途中都是最快的;如果实现没有明确的理由选择一种类型而不是另一种,它只会选择一些满足符号和宽度要求的整数类型。
(引自N1570 C11 草案。)
问题是,无论有没有 x32 ABI ,应该如何为 x86_64 架构定义[u]int_fast16_t和[u]int_fast32_t类型?是否有指定这些类型的 x32 文档?它们是否应该与 32 位 x86 定义(均为 32 位)兼容,或者,由于 x32 可以访问 64 位 CPU 寄存器,它们在使用或不使用 x32 ABI 的情况下是否应该具有相同的大小?(请注意,无论是否使用 x32 ABI,x86_64 都有 64 位寄存器。)
这是一个测试程序(取决于特定于 gcc 的__x86_64__宏):
#include <stdio.h>
#include <stdint.h>
#include <limits.h>
int main(void) {
#if …Run Code Online (Sandbox Code Playgroud) 我正在对算法进行基准测试,没有必要知道细节.主要组件是缓冲区(整数的原始数组)和索引器(整数 - 用于访问缓冲区中的元素).
缓冲区的最快类型似乎是unsigned char,以及short,int,long的有符号和无符号版本.但是char/signed char更慢.差异:1.07倍.
对于索引器,有符号和无符号类型之间没有区别.然而,int和long比char和short快1.21倍.
在考虑性能而不是内存消耗时,是否应该默认使用某种类型?
注意:缓冲区元素和索引器上使用的操作是赋值,递增,递减和比较.