标准明确指出静态持续时间变量(命名空间范围和类静态成员)的动态初始化不必在执行 main 之前发生: “命名空间范围对象的动态初始化(8.5、9.4、12.1、12.6.1)是否在 main 的第一条语句之前完成是实现定义的。”是 3.6.2(3) 动态初始化不是[总是?]如何实现的吗?有什么更好/更简单的方法来保证对象在使用前被初始化?
最佳答案
你的问题的答案在你引用的那句话之后的下一句(在 ISO/IEC 14882-2003 的 3.6.2 中)。
It is implementation-defined whether or not the dynamic initialization (8.5, 9.4, 12.1, 12.6.1) of an object of namespace scope is done before the first statement of main. If the initialization is deferred to some point in time after the first statement of main, it shall occur before the first use of any function or object defined in the same translation unit as the object to be initialized.
显然,要确保某些变量 X 已初始化,您只需在函数 main 中使用(直接或间接)在同一翻译单元中定义的任何函数或变量作为变量 X(例如,如果您在函数 main 中直接或间接使用 X,那么您可以确定它已经初始化)。
编辑:
如果除了保证您使用的变量已经初始化(它始终是 - 正如上面引用的标准文本所保证的那样)之外,您还想知道为什么标准包含在 之后可以延迟初始化的规定main 执行开始。
我的意思是如果问题也是:为什么不要求在 main 启动之前执行所有初始化?
嗯,这绝对不是关于动态链接 库的——在开始main 之前初始化它们的所有对象没有问题。此外,它与动态加载库(LoadLibrary/dlopen)无关——它们显然不在 C++ 标准的范围内(它们不是主题例如,一个定义规则,通常它们甚至可能不是 C++)。
理论上,此规定允许延迟初始化以避免不必要的运行时开销 - 例如除非您实际使用来自特定翻译单元(C++ 源文件)的某些函数或对象,否则您不必执行其运行时初始化。但是任何实现实际上都不太可能在运行时执行惰性初始化 - 多线程同步对于这种初始化具有挑战性,并且本身就是运行时开销。
但是 每个单独的实现实际做的是仅链接那些实际使用的模块(翻译单元)。因此,即使您链接了一些包含一些动态初始化对象的静态库(可能有副作用——比如文件创建或用户交互),但不使用来自同一翻译单元的任何东西——实现也没有义务运行这个对象的初始化根本。因此,此条款允许避免在最终可执行文件中包含任何未使用的翻译单元 - 即使它们是程序的正式部分。
关于c++ - 静态变量的动态初始化阶段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6372032/
在我的gem中,我需要yaml并且在我的本地计算机上运行良好。但是在将我的gem推送到rubygems.org之后,当我尝试使用我的gem时,我收到一条错误消息=>"uninitializedconstantPsych::Syck(NameError)"谁能帮我解决这个问题?附言RubyVersion=>ruby1.9.2,GemVersion=>1.6.2,Bundlerversion=>1.0.15 最佳答案 经过几个小时的研究,我发现=>“YAML使用未维护的Syck库,而Psych使用现代的LibYAML”因此,为了解决
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
我正在查看instance_variable_set的文档并看到给出的示例代码是这样做的:obj.instance_variable_set(:@instnc_var,"valuefortheinstancevariable")然后允许您在类的任何实例方法中以@instnc_var的形式访问该变量。我想知道为什么在@instnc_var之前需要一个冒号:。冒号有什么作用? 最佳答案 我的第一直觉是告诉你不要使用instance_variable_set除非你真的知道你用它做什么。它本质上是一种元编程工具或绕过实例变量可见性的黑客攻击
我正在编写一个gem,我必须在其中fork两个启动两个webrick服务器的进程。我想通过基类的类方法启动这个服务器,因为应该只有这两个服务器在运行,而不是多个。在运行时,我想调用这两个服务器上的一些方法来更改变量。我的问题是,我无法通过基类的类方法访问fork的实例变量。此外,我不能在我的基类中使用线程,因为在幕后我正在使用另一个不是线程安全的库。所以我必须将每个服务器派生到它自己的进程。我用类变量试过了,比如@@server。但是当我试图通过基类访问这个变量时,它是nil。我读到在Ruby中不可能在分支之间共享类变量,对吗?那么,还有其他解决办法吗?我考虑过使用单例,但我不确定这是
我在Rails工作并有以下类(class):classPlayer当我运行时bundleexecrailsconsole然后尝试:a=Player.new("me",5.0,"UCLA")我回来了:=>#我不知道为什么Player对象不会在这里初始化。关于可能导致此问题的操作/解释的任何建议?谢谢,马里奥格 最佳答案 havenoideawhythePlayerobjectwouldn'tbeinitializedhere它没有初始化很简单,因为你还没有初始化它!您已经覆盖了ActiveRecord::Base初始化方法,但您没有调
我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R
我有用于控制用户任务的Rails5API项目,我有以下错误,但并非总是针对相同的Controller和路由。ActionController::RoutingError:uninitializedconstantApi::V1::ApiController我向您描述了一些我的项目,以更详细地解释错误。应用结构路线scopemodule:'api'donamespace:v1do#=>Loginroutesscopemodule:'login'domatch'login',to:'sessions#login',as:'login',via::postend#=>Teamroutessc
我正在阅读一本关于Ruby的书,作者在编写类初始化定义时使用的形式与他在本书前几节中使用的形式略有不同。它看起来像这样:classTicketattr_accessor:venue,:datedefinitialize(venue,date)self.venue=venueself.date=dateendend在本书的前几节中,它的定义如下:classTicketattr_accessor:venue,:datedefinitialize(venue,date)@venue=venue@date=dateendend在第一个示例中使用setter方法与在第二个示例中使用实例变量之间是
我收到格式为的回复#我需要将其转换为哈希值(针对活跃商家)。目前我正在遍历变量并执行此操作:response.instance_variables.eachdo|r|my_hash.merge!(r.to_s.delete("@").intern=>response.instance_eval(r.to_s.delete("@")))end这有效,它将生成{:first="charlie",:last=>"kelly"},但它似乎有点hacky和不稳定。有更好的方法吗?编辑:我刚刚意识到我可以使用instance_variable_get作为该等式的第二部分,但这仍然是主要问题。
我正在编写一个简单的静态Rack应用程序。查看下面的config.ru代码:useRack::Static,:urls=>["/elements","/img","/pages","/users","/css","/js"],:root=>"archive"map'/'dorunProc.new{|env|[200,{'Content-Type'=>'text/html','Cache-Control'=>'public,max-age=6400'},File.open('archive/splash.html',File::RDONLY)]}endmap'/pages/search.