草庐IT

c++ - 是否有理由在跨平台代码中使用 C++11 的 std::int_fast32_t 或 std::int_fast16_t 而不是 int ?

coder 2023-06-02 原文

在 C++11 中,我们提供了固定宽度的整数类型,例如 std::int32_tstd::int64_t,它们是可选的,因此不是最适合编写跨平台代码。然而,我们也得到了这些类型的非可选变体:例如“快速”变体,例如std::int_fast32_tstd::int_fast64_t,以及“最小尺寸”变体,例如std::int_least32_t,它们的大小都至少是指定的位数。

我正在编写的代码是基于 C++11 的跨平台库的一部分,它支持在最流行的 Unix/Windows/Mac 编译器上进行编译。现在出现的一个问题是,用 C++11 固定宽度整数类型替换代码中现有的整数类型是否有优势。

使用 std::int16_tstd::int32_t 等变量的一个缺点是无法保证它们可用,因为只有在实现直接支持类型(根据 http://en.cppreference.com/w/cpp/types/integer )。

但是,由于int至少有16位,而且16位对于代码中使用的整数来说已经足够大了,那么std::int_fast16_t的用法呢?超过int?将所有 int 类型替换为 std::int_fast16_t 并将所有 unsigned int 类型替换为 std::uint_fast16_t 是否有好处? 以这种方式还是没有必要?

类似地,如果知道所有支持的平台和编译器都具有至少 32 位大小的 int,那么将它们替换为 std::int_fast32_t 是否有意义? std::uint_fast32_t 分别是什么?

最佳答案

int 在当前计算机和编译器上可以是 16、32 甚至 64 位。 future ,它可能会更大(比如 128 位)。

如果你的代码没问题,那就去吧。

如果您的代码仅经过测试并使用 32 位整数,则考虑使用 int32_t。然后,当在没有 32 位整数的系统上运行时,代码将在编译时而不是在运行时失败(这在今天极为罕见)。

int_fast32_t 是你需要至少 32 位,但你非常关心性能的时候。在将 32 位整数加载为 64 位整数的硬件上,然后在繁琐的过程中将位移回 32 位整数,int_fast_32_t 可能是 64 位整数。这样做的代价是,在不知名的平台上,您的代码行为会大不相同。

如果您不在此类平台上进行测试,我建议您不要这样做。

在构建时中断通常比在运行时中断要好。如果并且当您的代码实际运行在需要这些功能的一些不起眼的处理器上时,然后修复它。 “你可能不需要它”的规则适用。

保守一点,在未经测试的硬件上产生早期错误,当您需要移植到所述硬件时,请执行可靠的工作和测试。

简而言之:

使用 int_fast##_t 当且仅当您在 int 大小变化的平台上测试您的代码(并将继续测试它),并且您有表明性能改进值得 future 维护。

int##_t 与常见的 ## 大小一起使用意味着您的代码将无法在您尚未测试过的平台上编译。这很好;未经测试的代码是不可靠的,不可靠的代码通常比无用的代码更糟糕。

不使用 int32_t 和使用 int,您的代码有时会有 32 位的 int,有时还有 64 位的 int(以及理论上更多),有时 int 是 16。如果你愿意在每个这样的 int 中测试和支持每个这样的情况,那就去吧。

请注意,int_fast##_t 数组可能存在缓存问题:它们可能大得不合理。例如,int_fast16_t 可以是 64 位。几千或几百万个数组可能单独使用起来很快,但是由于它们的体积导致的缓存未命中可能会使它们总体上变慢;并且将事物换成较慢存储的风险也在增加。

int_least##_t 在这些情况下会更快。

这同样适用于网络传输和文件存储的数据,而且网络/文件数据通常必须遵循在编译器/硬件更改时稳定的格式这一明显问题。然而,这是一个不同的问题。

但是,当使用固定宽度整数类型时,您必须特别注意 int、long 等仍然具有与以前相同的宽度这一事实。整数提升仍然基于 int 的大小,这取决于您使用的编译器。代码中的整数将是 int 类型,具有相关的宽度。如果您使用不同的编译器编译代码,这可能会导致不需要的行为。更多详细信息:https://stackoverflow.com/a/13424208/3144964

关于c++ - 是否有理由在跨平台代码中使用 C++11 的 std::int_fast32_t 或 std::int_fast16_t 而不是 int ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36161393/

有关c++ - 是否有理由在跨平台代码中使用 C++11 的 std::int_fast32_t 或 std::int_fast16_t 而不是 int ?的更多相关文章

  1. ruby - 将数组的内容转换为 int - 2

    我需要读入一个包含数字列表的文件。此代码读取文件并将其放入二维数组中。现在我需要获取数组中所有数字的平均值,但我需要将数组的内容更改为int。有什么想法可以将to_i方法放在哪里吗?ClassTerraindefinitializefile_name@input=IO.readlines(file_name)#readinfile@size=@input[0].to_i@land=[@size]x=1whilex 最佳答案 只需将数组映射为整数:@land边注如果你想得到一条线的平均值,你可以这样做:values=@input[x]

  2. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  3. ruby - Fast-stemmer 安装问题 - 2

    由于fast-stemmer的问题,我很难安装我想要的任何ruby​​gem。我把我得到的错误放在下面。Buildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingfast-stemmer:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcreatingMakefilemake"DESTDIR="cleanmake"DESTDIR=

  4. ruby - 使用 `+=` 和 `send` 方法 - 2

    如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:

  5. 【Java 面试合集】HashMap中为什么引入红黑树,而不是AVL树呢 - 2

    HashMap中为什么引入红黑树,而不是AVL树呢1.概述开始学习这个知识点之前我们需要知道,在JDK1.8以及之前,针对HashMap有什么不同。JDK1.7的时候,HashMap的底层实现是数组+链表JDK1.8的时候,HashMap的底层实现是数组+链表+红黑树我们要思考一个问题,为什么要从链表转为红黑树呢。首先先让我们了解下链表有什么不好???2.链表上述的截图其实就是链表的结构,我们来看下链表的增删改查的时间复杂度增:因为链表不是线性结构,所以每次添加的时候,只需要移动一个节点,所以可以理解为复杂度是N(1)删:算法时间复杂度跟增保持一致查:既然是非线性结构,所以查询某一个节点的时候

  6. ruby - 如何计算 Liquid 中的变量 +1 - 2

    我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我

  7. arrays - Ruby 数组 += vs 推送 - 2

    我有一个数组数组,想将元素附加到子数组。+=做我想做的,但我想了解为什么push不做。我期望的行为(并与+=一起工作):b=Array.new(3,[])b[0]+=["apple"]b[1]+=["orange"]b[2]+=["frog"]b=>[["苹果"],["橙子"],["Frog"]]通过推送,我将推送的元素附加到每个子数组(为什么?):a=Array.new(3,[])a[0].push("apple")a[1].push("orange")a[2].push("frog")a=>[[“苹果”、“橙子”、“Frog”]、[“苹果”、“橙子”、“Frog”]、[“苹果”、“

  8. += 的 Ruby 方法 - 2

    有没有办法让Ruby能够做这样的事情?classPlane@moved=0@x=0defx+=(v)#thisiserror@x+=v@moved+=1enddefto_s"moved#{@moved}times,currentxis#{@x}"endendplane=Plane.newplane.x+=5plane.x+=10putsplane.to_s#moved2times,currentxis15 最佳答案 您不能在Ruby中覆盖复合赋值运算符。任务在内部处理。您应该覆盖+,而不是+=。plane.a+=b与plane.a=

  9. ruby - 在 Ruby 中实现 to_int 和 to_str 的后果 - 2

    我haveaclass它公开了一个字符串值和一个int值(分别是命令输出和退出代码)。除了通过to_s和to_i公开它们之外,我还使用to_str和to_int,如下所示:classStatusdefto_s@outputendalias:to_str:to_sdefto_i@status.exitstatusendalias:to_int:to_iend我的想法是能够在尽可能多的情况下使用这个对象。将其强制转换为字符串或整数会增加可用性。例如,我可以将对象与字符串连接起来:a_string="Outputwas:"+results(我想用这个作为int强制转换的例子,但是Fixnum

  10. ruby - 强制浏览器下载文件而不是打开文件 - 2

    我要下载http://foobar.com/song.mp3作为song.mp3,而不是让Chrome在其native中打开它浏览器中的播放器。我怎样才能做到这一点? 最佳答案 您只需要确保发送这些header:Content-Disposition:attachment;filename=song.mp3;Content-Type:application/octet-streamContent-Transfer-Encoding:binarysend_file方法为您完成:get'/:file'do|file|file=File.

随机推荐