我发现 C++ 中琐碎类型的复杂性很容易理解,希望有人能在以下方面启发我。
给定类型 T ,存储为T使用 ::operator new(std::size_t) 分配或 ::operator new[](std::size_t)或 std::aligned_storage , 和 void * p指向该存储中的一个位置,该位置与 T 对齐以便它可以在 p 构建:
std::is_trivially_default_constructible<T>::value成立,是当代码跳过T 的初始化时调用未定义行为的代码在 p (即通过使用 T * tPtr = new (p) T(); ),否则访问 *p作为 T ?一个人可以用T * tPtr = static_cast<T *>(p);而不必担心在这种情况下出现未定义的行为?std::is_trivially_destructible<T>::value成立,跳过破坏T在 *p (即通过调用 tPtr->~T(); )导致未定义的行为?U std::is_trivially_assignable<T, U>::value持有,是std::memcpy(&t, &u, sizeof(U));相当于 t = std::forward<U>(u); (对于 t 类型的任何 T 和 u 类型的 U )还是会导致未定义的行为?最佳答案
不,你不能。没有 T 类型的对象在那个存储中,并访问存储,就像有 is undefined .另见 T.C. 的回答 here .
只是为了澄清 [basic.life]/1 中的措辞,它表示具有空初始化的对象从存储分配开始就处于事件状态:该措辞显然是指对象的初始化。使用 operator new 分配原始存储时,没有对象的初始化是空的或 malloc ,因此我们不能认为“它”是活着的,因为“它”不存在。实际上,只有在分配了存储空间之后,但在进行空初始化之前(即遇到了它们的定义),才能访问由具有空初始化的定义创建的对象。
省略析构函数调用本身永远不会导致未定义的行为。但是,在这方面尝试任何优化都是没有意义的,例如模板,因为一个微不足道的析构函数只是被优化掉了。
现在,要求是being trivially copyable ,并且类型必须匹配。但是,这可能过于严格。 Dos Reis's N3751至少提出了不同的类型也可以工作,我可以想象这个规则将来会扩展到跨一种类型的琐碎复制分配。
但是,您具体展示的内容没有多大意义(尤其是因为您要求分配给格式错误的标量 xvalue),因为在分配为实际上并不是“微不足道的”,即与 memcpy 具有相同的语义.例如。 is_trivially_assignable<int&, double>并不意味着可以通过复制对象表示将一个“分配”给另一个。
关于c++ - 管理琐碎类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42294487/
我正在使用i18n从头开始构建一个多语言网络应用程序,虽然我自己可以处理一大堆yml文件,但我说的语言(非常)有限,最终我想寻求外部帮助帮助。我想知道这里是否有人在使用UI插件/gem(与django上的django-rosetta不同)来处理多个翻译器,其中一些翻译器不愿意或无法处理存储库中的100多个文件,处理语言数据。谢谢&问候,安德拉斯(如果您已经在rubyonrails-talk上遇到了这个问题,我们深表歉意) 最佳答案 有一个rails3branchofthetolkgem在github上。您可以通过在Gemfi
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
我可以得到Infinity和NaNn=9.0/0#=>Infinityn.class#=>Floatm=0/0.0#=>NaNm.class#=>Float但是当我想直接访问Infinity或NaN时:Infinity#=>uninitializedconstantInfinity(NameError)NaN#=>uninitializedconstantNaN(NameError)什么是Infinity和NaN?它们是对象、关键字还是其他东西? 最佳答案 您看到打印为Infinity和NaN的只是Float类的两个特殊实例的字符串
我不确定传递给方法的对象的类型是否正确。我可能会将一个字符串传递给一个只能处理整数的函数。某种运行时保证怎么样?我看不到比以下更好的选择:defsomeFixNumMangler(input)raise"wrongtype:integerrequired"unlessinput.class==FixNumother_stuffend有更好的选择吗? 最佳答案 使用Kernel#Integer在使用之前转换输入的方法。当无法以任何合理的方式将输入转换为整数时,它将引发ArgumentError。defmy_method(number)
有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳
我正在尝试解析一个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
我安装了ruby版本管理器,并将RVM安装的ruby实现设置为默认值,这样'哪个ruby'显示'~/.rvm/ruby-1.8.6-p383/bin/ruby'但是当我在emacs中打开inf-ruby缓冲区时,它使用安装在/usr/bin中的ruby。有没有办法让emacs像shell一样尊重ruby的路径?谢谢! 最佳答案 我创建了一个emacs扩展来将rvm集成到emacs中。如果您有兴趣,可以在这里获取:http://github.com/senny/rvm.el
我正在玩HTML5视频并且在ERB中有以下片段:mp4视频从在我的开发环境中运行的服务器很好地流式传输到chrome。然而firefox显示带有海报图像的视频播放器,但带有一个大X。问题似乎是mongrel不确定ogv扩展的mime类型,并且只返回text/plain,如curl所示:$curl-Ihttp://0.0.0.0:3000/pr6.ogvHTTP/1.1200OKConnection:closeDate:Mon,19Apr201012:33:50GMTLast-Modified:Sun,18Apr201012:46:07GMTContent-Type:text/plain
是否有简单的方法来更改默认ISO格式(yyyy-mm-dd)的ActiveAdmin日期过滤器显示格式? 最佳答案 您可以像这样为日期选择器提供额外的选项,而不是覆盖js:=f.input:my_date,as::datepicker,datepicker_options:{dateFormat:"mm/dd/yy"} 关于ruby-on-rails-事件管理员日期过滤器日期格式自定义,我们在StackOverflow上找到一个类似的问题: https://s
如何将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.你能做的最好的事情是: