我倾向于经常使用以下符号:
const Datum& d = a.calc();
// continue to use d
当 calc 的结果在堆栈上时,这有效,参见 http://herbsutter.com/2008/01/01/gotw-88-a-candidate-for-the-most-important-const/ .尽管编译器可能会在此处进行优化,但显式避免临时对象感觉很好。
今天我意识到,d的内容在数据写入a的成员后变得无效。在这种特殊情况下,get 函数只是返回对另一个成员的引用,然而这与 write 完全无关。像这样:
const Datum& d = a.get();
// ... some operation ...
a.somedata = Datum2();
// now d is invalid.
同样,这里的 somedata 与 d 或 get() 无关。
现在我问自己:
除了 Qt GUI 线程外,我的应用程序是单线程的。
最佳答案
你似乎害怕省略失败。那auto x = some_func();将导致在 auto&& x = some_func(); 上进行额外的移动构造什么时候some_func()返回一个临时对象。
你不应该。
如果省略失败,则意味着您的编译器不称职,或者使用坦率的敌对设置进行编译。而且你无法在敌对设置或不称职的编译器中生存:不称职的编译器可以转a+=b用整数转化为 for (int i = 0; i < abs(b); ++i) {if (b>0) ++a; else --a;}一点也不违反标准。
省略是一项核心语言功能。不要仅仅因为您不相信它会发生而编写糟糕的代码。
当您想要引用函数提供的数据而不是数据的独立稳定拷贝时,您应该通过引用捕获。如果您不了解函数的返回值的生命周期,则通过引用捕获根本不安全。
即使您知道数据会稳定,但维护代码所花费的时间比编写代码所花费的时间要多:阅读您代码的人必须能够一眼看出您的假设成立。非本地错误是不好的:对您调用的函数的看似无害的更改不应该破坏您的代码。
最终的结果是,除非你有充分的理由不这样做,否则按值(value)来看待事物。
按值取值让您和编译器更容易推理您的代码。它增加了局部性。
当您有充分的理由不这样做时,请参照引用。
根据上下文,这个充分的理由可能不必非常充分。但它不应该基于一个不称职的编译器的假设。
应该避免过早的悲观化,但也应该避免过早的优化。获取(或存储)引用而不是值应该是你在发现性能问题时所做的事情。编写干净、易于理解的代码。将复杂性插入紧密编写的类型中,并使外部界面简洁明了。按值(value)看待事物,因为值(value)与状态分离。
优化是可替代的。通过使更多代码更简单,您可以使其更易于使用(并提高工作效率)。然后,当您确定性能很重要的部分时,您可以在那里努力使代码更快。
一个重要的例子是基础代码:如果编写时没有考虑到性能和易用性,基础代码(无处不在)很快就会成为性能的普遍拖累。在这种情况下,您希望将复杂性隐藏在内部类型中,并公开一个简单易用的外部界面,不需要用户理解其内部结构。
但是在某处的随机函数中编写代码?使用值,最容易使用的容器,具有最友好的 O-notation 到您执行的最昂贵操作和最简单的界面。 vector 如果合理(避免过早的 pessmiziation),但不要出汗几张 map 。
找到占用 90%-99% 时间的 1%-10% 的代码,并尽快完成。如果您的代码的其余部分具有良好的 O 表示法性能(因此在处理比您测试的数据集更大的数据集时它不会慢得惊人),您将处于良好状态。然后开始用可笑的数据集进行测试,然后找到慢的部分。
关于c++ - 在哪些情况下 (const) 引用返回值是不安全的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32104844/
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
这是在Ruby中设置默认值的常用方法:classQuietByDefaultdefinitialize(opts={})@verbose=opts[:verbose]endend这是一个容易落入的陷阱:classVerboseNoMatterWhatdefinitialize(opts={})@verbose=opts[:verbose]||trueendend正确的做法是:classVerboseByDefaultdefinitialize(opts={})@verbose=opts.include?(:verbose)?opts[:verbose]:trueendend编写Verb
我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A
我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re
所以我开始关注ruby,很多东西看起来不错,但我对隐式return语句很反感。我理解默认情况下让所有内容返回self或nil但不是语句的最后一个值。对我来说,它看起来非常脆弱(尤其是)如果你正在使用一个不打算返回某些东西的方法(尤其是一个改变状态/破坏性方法的函数!),其他人可能最终依赖于一个返回对方法的目的并不重要,并且有很大的改变机会。隐式返回有什么意义?有没有办法让事情变得更简单?总是有返回以防止隐含返回被认为是好的做法吗?我是不是太担心这个了?附言当人们想要从方法中返回特定的东西时,他们是否经常使用隐式返回,这不是让你组中的其他人更容易破坏彼此的代码吗?当然,记录一切并给出
我想让一个yaml对象引用另一个,如下所示:intro:"Hello,dearuser."registration:$introThanksforregistering!new_message:$introYouhaveanewmessage!上面的语法只是它如何工作的一个例子(这也是它在thiscpanmodule中的工作方式。)我正在使用标准的rubyyaml解析器。这可能吗? 最佳答案 一些yaml对象确实引用了其他对象:irb>require'yaml'#=>trueirb>str="hello"#=>"hello"ir
我最近决定从我的系统中卸载RVM。在thispage提出的一些论点说服我:实际上,我的决定是,我根本不想担心Ruby的多个版本。我只想使用1.9.2-p290版本而不用担心其他任何事情。但是,当我在我的Mac上运行ruby--version时,它告诉我我的版本是1.8.7。我四处寻找如何简单地从我的Mac上卸载这个Ruby,但奇怪的是我没有找到任何东西。似乎唯一想卸载Ruby的人运行linux,而使用Mac的每个人都推荐RVM。如何从我的Mac上卸载Ruby1.8.7?我想升级到1.9.2-p290版本,并且我希望我的系统上只有一个版本。 最佳答案
在Ruby中是否有Gem或安全删除文件的方法?我想避免系统上可能不存在的外部程序。“安全删除”指的是覆盖文件内容。 最佳答案 如果您使用的是*nix,一个很好的方法是使用exec/open3/open4调用shred:`shred-fxuz#{filename}`http://www.gnu.org/s/coreutils/manual/html_node/shred-invocation.html检查这个类似的帖子:Writingafileshredderinpythonorruby?
如何将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.你能做的最好的事情是:
我正在使用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("