草庐IT

c++ - 在编译时解析 (u)int_fastX_t

coder 2024-02-24 原文

C++ 标准 typedef 的实现将 (u)int_fastX 类型定义为其内置类型之一。这需要研究哪种类型最快,但不可能对每种情况都有一种最快的类型。

在编译时解析此类类型以通过为实际使用选择最佳类型来解决这种情况是否会提高性能?编译器会分析 _fast 变量的使用,然后选择最佳类型。发挥作用的因素可能是对齐方式和变量使用的操作类型。

这将有效地使这些类型成为一种语言特性。

当编译器突然决定为这样的变量选择另一个宽度时,这可能会引入错误。但是在这种用例中不应该使用 _fast 类型,无论如何,行为取决于宽度。

标准允许这样的编译时解析吗? 如果是,为什么到今天还没有实现? 如果不是,为什么不在标准中?

最佳答案

不,这是标准不允许的。请记住,对于这个特定领域,C++ 标准遵从 C,例如,根据 C++11 1.1 /2,C++11 遵从 C99。 .具体来说,C++11 18.4.1 Header <cstdint> synopsis /2状态:

The header defines all functions, types, and macros the same as 7.18 in the C standard.

所以让我们先解决你的第一个争论,你说:

Implementations of the C++ standard typedef the (u)int_fastX types as one of their built in types. This requires research in which type is the fastest, but there cannot be one fastest type for every case.

C 标准在 c99 7.18.1.3 Fastest minimum-width integer types 中是这样说的(我的斜体):

Each of the following types designates an integer type that is usually fastest to operate with among all integer types that have at least the specified width.

The designated type is not guaranteed to be fastest for all purposes; if the implementation has no clear grounds for choosing one type over another, it will simply pick some integer type satisfying the signedness and width requirements.

所以你确实是正确的,一个类型不可能对所有可能的用途都是最快的,但这似乎不是作者在定义这些方面时所考虑的。

固定宽度类型的引入(在我看来)是为了解决所有开发人员在使用不同的 int 时遇到的问题。跨各种实现的宽度。

同样,一旦开发人员知道了他们想要的值的范围,快速的最小宽度类型为他们提供了一种以最大可能速度对这些值进行算术运算的方法。

在最后一段中涵盖您的三个具体问题(下面以粗体显示):


(1) 标准允许这样的编译时分辨率吗?

我不这么认为。 C 标准的相关部分有这么一小段文字:

For each type described herein that the implementation provides, <stdint.h> shall declare that typedef name and define the associated macros.

这似乎表明它必须是一个 typedef由实现提供,并且由于没有“可变”typedef,因此必须对其进行修复。

可能有回旋余地,因为有可能提供不同的 typedef取决于某些环境考虑因素,但实际实现起来的难度似乎非常高(请参阅我对下面第三个问题的回答)。

其中最主要的是,如果这些自适应类型具有外部链接,则在链接在一起时需要所有编译的翻译单元之间达成一致。拥有一个 16 位类型的单元和另一个 32 位类型的单元会导致各种问题。


(2) 如果是,为什么到今天还没有实现?

我将“否”作为你第一个问题的答案,所以除了让你引用下面第三个问题的答案外,我不打算对此进行推测(它可能没有实现,因为它非常困难,有可疑的好处)。


(3)如果没有,为什么不在标准中?

标准是实现者和用户之间的契约(Contract),描述了实现者将提供的内容。通常,标准委员会中前者(他们并不热衷于为自己做太多额外的工作)往往比后者多。

例如,我喜欢在 C 中拥有所有你喜欢的 C++ 数据结构,但这会导致标准版本相隔几十年而不是几年 :-)

关于c++ - 在编译时解析 (u)int_fastX_t,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41674239/

有关c++ - 在编译时解析 (u)int_fastX_t的更多相关文章

  1. Ruby 解析字符串 - 2

    我有一个字符串input="maybe(thisis|thatwas)some((nice|ugly)(day|night)|(strange(weather|time)))"Ruby中解析该字符串的最佳方法是什么?我的意思是脚本应该能够像这样构建句子:maybethisissomeuglynightmaybethatwassomenicenightmaybethiswassomestrangetime等等,你明白了......我应该一个字符一个字符地读取字符串并构建一个带有堆栈的状态机来存储括号值以供以后计算,还是有更好的方法?也许为此目的准备了一个开箱即用的库?

  2. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  3. 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]

  4. ruby - 用逗号、双引号和编码解析 csv - 2

    我正在使用ruby​​1.9解析以下带有MacRoman字符的csv文件#encoding:ISO-8859-1#csv_parse.csvName,main-dialogue"Marceu","Giveittohimóhe,hiswife."我做了以下解析。require'csv'input_string=File.read("../csv_parse.rb").force_encoding("ISO-8859-1").encode("UTF-8")#=>"Name,main-dialogue\r\n\"Marceu\",\"Giveittohim\x97he,hiswife.\"\

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

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

  6. ruby-on-rails - 我更新了 ruby​​ gems,现在到处都收到解析树错误和弃用警告! - 2

    简而言之错误:NOTE:Gem::SourceIndex#add_specisdeprecated,useSpecification.add_spec.Itwillberemovedonorafter2011-11-01.Gem::SourceIndex#add_speccalledfrom/opt/local/lib/ruby/site_ruby/1.8/rubygems/source_index.rb:91./opt/local/lib/ruby/gems/1.8/gems/rails-2.3.8/lib/rails/gem_dependency.rb:275:in`==':und

  7. ruby - Sinatra set cache_control to static files in public folder编译错误 - 2

    我不知道为什么,但是当我设置这个设置时它无法编译设置:static_cache_control,[:public,:max_age=>300]这是我得到的syntaxerror,unexpectedtASSOC,expecting']'(SyntaxError)set:static_cache_control,[:public,:max_age=>300]^我只想将“过期”header设置为css、javaascript和图像文件。谢谢。 最佳答案 我猜您使用的是Ruby1.8.7。Sinatra文档中显示的语法似乎是在Ruby1.

  8. 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.你能做的最好的事情是:

  9. 安卓apk修改(Android反编译apk) - 2

    最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

  10. ruby - 用 YAML.load 解析 json 安全吗? - 2

    我正在使用ruby2.1.0我有一个json文件。例如:test.json{"item":[{"apple":1},{"banana":2}]}用YAML.load加载这个文件安全吗?YAML.load(File.read('test.json'))我正在尝试加载一个json或yaml格式的文件。 最佳答案 YAML可以加载JSONYAML.load('{"something":"test","other":4}')=>{"something"=>"test","other"=>4}JSON将无法加载YAML。JSON.load("

随机推荐