从 C++11 开始,我们可以使用 auto a = 1+2 而不是 int a = 1+2 并且编译器推断出 a 的类型 本身。它是如何工作的?在编译时(更多操作)是否比自己声明类型慢?
最佳答案
auto要求 C++11 编译器 生成一些有限 type inference (查看 Ocaml 如果你想要一些更性感的类型推理语言)。但是开销只是编译时的。
如果你替换auto a=1+2;与 int a=1+2; (两者具有相同的含义,请参阅 answer by simplicis )并且如果您要求编译器 optimize (甚至可能不要求优化)你可能会得到相同的 machine code .另见 this .
如果使用 GCC尝试编译一个小的 C++11 foo.cc文件 g++ -Wall -fverbose-asm -O -S foo.cc并查看(使用编辑器)生成的 foo.s汇编程序文件。您将看不到生成的代码有什么不同(但汇编程序文件可能会略有变化,例如,由于调试信息等元数据)
如果您担心较慢的编译时间,我想使用auto不是决定性因素(可能,重载在编译时间上的成本更高)。 C++11 几乎被设计成实际上需要很多optimizations (特别是复杂的内联和常量折叠和死代码消除),它的“解析”(特别是头文件包含和模板扩展)是昂贵的。
Precompiling headers并与 make -j 并行构建(也许 ccache 或 distcc )可能有助于改善整体编译时间,远比避免 auto 更有效.
如果您想系统地避免 auto (特别是在 range-for 循环中,如 std::map<std::string,int> dict; for (auto it: dict) { ... } )你最终会输入更多的源代码(其解析和检查需要大量时间),并且有更多的错误风险。正如解释的那样 here ,您可能会稍微猜错类型,并且(稍微错误地)明确它可能会因为额外的转换而减慢代码的执行速度。
如果使用 GCC你可能会通过 -ftime-report 至 g++并获取有关各种 GCC 遍和阶段的时间测量值。
关于c++ - `auto` 说明符的编译时间是否较慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32519082/
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife
我有一个包含多个键的散列和一个字符串,该字符串不包含散列中的任何键或包含一个键。h={"k1"=>"v1","k2"=>"v2","k3"=>"v3"}s="thisisanexamplestringthatmightoccurwithakeysomewhereinthestringk1(withspecialcharacterslike(^&*$#@!^&&*))"检查s是否包含h中的任何键的最佳方法是什么,如果包含,则返回它包含的键的值?例如,对于上面的h和s的例子,输出应该是v1。编辑:只有字符串是用户定义的。哈希将始终相同。 最佳答案
我需要检查DateTime是否采用有效的ISO8601格式。喜欢:#iso8601?我检查了ruby是否有特定方法,但没有找到。目前我正在使用date.iso8601==date来检查这个。有什么好的方法吗?编辑解释我的环境,并改变问题的范围。因此,我的项目将使用jsapiFullCalendar,这就是我需要iso8601字符串格式的原因。我想知道更好或正确的方法是什么,以正确的格式将日期保存在数据库中,或者让ActiveRecord完成它们的工作并在我需要时间信息时对其进行操作。 最佳答案 我不太明白你的问题。我假设您想检查
我的日期格式如下:"%d-%m-%Y"(例如,今天的日期为07-09-2015),我想看看是不是在过去的七天内。谁能推荐一种方法? 最佳答案 你可以这样做:require"date"Date.today-7 关于ruby-检查日期是否在过去7天内,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/32438063/
这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下
我们的git存储库中目前有一个Gemfile。但是,有一个gem我只在我的环境中本地使用(我的团队不使用它)。为了使用它,我必须将它添加到我们的Gemfile中,但每次我checkout到我们的master/dev主分支时,由于与跟踪的gemfile冲突,我必须删除它。我想要的是类似Gemfile.local的东西,它将继承从Gemfile导入的gems,但也允许在那里导入新的gems以供使用只有我的机器。此文件将在.gitignore中被忽略。这可能吗? 最佳答案 设置BUNDLE_GEMFILE环境变量:BUNDLE_GEMFI
这个问题在这里已经有了答案:Railsformattingdate(4个答案)关闭4年前。我想格式化Time.Now函数以显示YYYY-MM-DDHH:MM:SS而不是:“2018-03-0909:47:19+0000”该函数需要放在时间中.现在功能。require‘roo’require‘roo-xls’require‘byebug’file_name=ARGV.first||“Template.xlsx”excel_file=Roo::Spreadsheet.open(“./#{file_name}“,extension::xlsx)xml=Nokogiri::XML::Build
我正在尝试解析一个CSV文件并使用SQL命令自动为其创建一个表。CSV中的第一行给出了列标题。但我需要推断每个列的类型。Ruby中是否有任何函数可以找到每个字段中内容的类型。例如,CSV行:"12012","Test","1233.22","12:21:22","10/10/2009"应该产生像这样的类型['integer','string','float','time','date']谢谢! 最佳答案 require'time'defto_something(str)if(num=Integer(str)rescueFloat(s