相关疑难解决方法(0)

为什么首选uint32_t而不是uint_fast32_t?

它似乎uint32_tuint_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受青睐?是简单地知道还是比其他技术有优势?

c c++ int

79
推荐指数
8
解决办法
8183
查看次数

64位C++中的sizeof(long)

我已经下载了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的完整条目包括:

...

c++ 64-bit

19
推荐指数
2
解决办法
4万
查看次数

为什么uint_least16_t比uint_fast16_t快于x86_64中的乘法?

关于uint_fast*_t类型族,C标准还不太清楚.在gcc-4.4.4 linux x86_64系统上,类型uint_fast16_tuint_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字节类型,那会不会更好?

c unsigned x86-64 multiplication

11
推荐指数
2
解决办法
2983
查看次数

[u]int_fastN_t 类型应该如何为 x86_64 定义,有或没有 x32 ABI?

X32 ABI指定,除其他事项外,对于x86_64体系生成的代码32位指针。它结合了 x86_64 架构(包括 64 位 CPU 寄存器)的优点和 32 位指针减少的开销。

<stdint.h>报头定义的typedef int_fast8_tint_fast16_tint_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)

c x86-64 stdint linux-x32-abi

5
推荐指数
1
解决办法
545
查看次数

C++ - 最快的整数类型?

我正在对算法进行基准测试,没有必要知道细节.主要组件是缓冲区(整数的原始数组)和索引器(整数 - 用于访问缓冲区中的元素).

缓冲区的最快类型似乎是unsigned char,以及short,int,long的有符号和无符号版本.但是char/signed char更慢.差异:1.07倍.

对于索引器,有符号和无符号类型之间没有区别.然而,int和long比char和short快1.21倍.

在考虑性能而不是内存消耗时,是否应该默认使用某种类型?

注意:缓冲区元素和索引器上使用的操作是赋值,递增,递减和比较.

c++ performance

4
推荐指数
1
解决办法
6467
查看次数

标签 统计

c ×3

c++ ×3

x86-64 ×2

64-bit ×1

int ×1

linux-x32-abi ×1

multiplication ×1

performance ×1

stdint ×1

unsigned ×1