问题标签 [static-initialization]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 本地静态对象的非延迟初始化?
对于 gcc (4.8) 或 icc (14.0) 是否有任何模式或其他非标准机制可以保证静态局部变量的早期安全构造?
我需要一个本地静态对象引用的全局集合,以便在运行时进行可控制的粗略分析。标准的延迟构造(以及处理锁定或冗余的 thread_local 集合)对我造成了极大的伤害,并且在开始时拥有完整的点列表将是非常有利的。
有希望实现这一目标吗?
我已经阅读了 C++11 规范的 Schwarz Counters 和第 3.6.2 (basic.start.init) / 6.7 (stmt.decl) 部分,但我对编译器特定的行为和找不到其他人发布有关尝试实现此技巧的信息。
接受的答案:
正如约翰在下面指出的那样,所有类(可能)在 main() 之前初始化其静态成员,但鉴于此C++11 §9.4.2/5 [class.static.data]
并§9.8/4 [class.local]
禁止本地类中的静态数据成员,该类在本地类上模板化并具有该类的静态数据成员可以在 start-time 完成其初始化。相当绝妙的洞察力,甚至比我最初想象的还要微妙!
另请注意,对集合使用 Meyers 单例方法完成了此方法的整体安全性。但是,可能必须锁定集合以防止点的并发静态初始化。我仍然需要检查规范以确认此规范以及静态成员初始化是否实际上强制在 main() 之前完成。
c++ - C++中的静态成员和封装
让我们假设以下类:
FileManipulator
使用两个文件中的数据从getResult()
. 这意味着针对不同对象的多次迭代filetwo
和通过迭代的多次构造。让我们说,输入是一些 .csv 数据库。整个任务保持不变。FileManipulators
InputTypeTwo
InputTypeOne
程序本身是多模块的,上面的操作只是它的小单元。
我的问题是如何static
根据面向对象的范式和封装来处理该领域。该字段必须以某种方式初始化,因为它不是不同程序执行的固定值。据我了解 C++ 规则,我无法创建设置字段的方法,但在我看来,将其公开并在任何类(FileManipulator
或友好的类)之外对其进行初始化似乎与封装不一致。
那我能做什么?我想到的唯一一件事就是以 C 方式进行,即在一个足够隔离的编译单元中对其进行初始化。这真的是我能做的吗?如何以专业的方式解决?
编辑
我将指向常量的指针更正为常量指针,这是我的初衷。
c++ - gcc中模板的非延迟静态成员初始化?
gcc 是否对静态成员初始化时间有任何保证,尤其是关于模板类?
我想知道当跨多个编译单元实例化类时,我是否可以获得静态成员(PWrap_T<T>::p_s
)将在之前初始化的硬性保证。main()
在 main 开始时尝试从每个编译单元手动触摸一个符号是不切实际的,但我不清楚其他任何东西都可以工作。
我已经用bar()
不同单位的方法进行了测试,并且总是得到想要的结果,但我需要知道 gcc 何时/是否会拉出地毯以及它是否可以预防。
此外,是否会在库完成加载之前初始化 DSO 中的所有静态成员?
(C++11 §3.6.2/4 - [basic.start.init]:)
具有静态存储持续时间的非局部变量的动态初始化是否在 main 的第一条语句之前完成是实现定义的。如果初始化推迟到 main 的第一个语句之后的某个时间点,它应该发生在与要初始化的变量在同一翻译单元中定义的任何函数或变量的第一次 odr-use (3.2) 之前。
...具有静态存储持续时间的非局部变量具有初始化副作用,即使它没有被 odr 使用(3.2、3.7.1),也必须初始化。
此外,尝试__attribute__ ((init_priority(int)))
或__attribute__ ((constructor))
为模板成员的初始化 yield warning: attributes after parenthesized initializer ignored
,我不知道有关静态初始化的其他技巧。
提前感谢任何可以给我答案的人!
c++ - 静态初始化顺序和字符串连接
我们有一个相当大的项目,它在几个地方定义了static const std::string
s 用作参数名称;其中一些需要在静态初始化期间连接:
富.h:
foo.cpp:
酒吧.h:
bar.cpp:
baz.h:
baz.cpp:
问题显然是“静态初始化惨败”,因为它未定义static const
成员初始化的顺序。
我不喜欢通常的解决方案,即用函数替换所有这些变量,因为
- 有很多这些变量,即很多代码更改
- 连接需要特殊的函数,这使得代码库不一致甚至更难看
我目前不能使用 C++11,它的constexpr
特性会让事情变得更容易(我认为)。
问题是:有什么技巧可以让我连接static const std::string
s (或包装对象或其他)来初始化另一个 sstatic const std::string
吗?
java - 在应用程序启动时强制 scala.Predef 初始化而不影响代码
类的初始化scala.Predef
是懒惰的重量级操作,可能会导致应用程序意外减速,并且在时间很重要的情况下(如编程竞赛)会成为麻烦。
scala.Predef
那么我可以在不更改代码的情况下仅使用 scala 编译器或 VM 选项关闭它的惰性并在应用程序启动时强制初始化吗?
java - 通过 VM 选项调用 java 类静态初始化
有没有办法B
在进入 class 的main()
方法之前强制静态初始化某些类A
,而不改变 class A
,只使用 VM 选项?
c# - 静态初始化器/构造器排序
我今天遇到了一个有趣的错误,下面的代码会在某些机器上的注释行上崩溃,而在其他机器上则不会。该问题似乎与静态构造函数、静态初始化程序和继承的顺序有关。
解决方法是将#region 中的代码移到另一个类中,但我仍然不明白实际发生了什么,以及为什么它似乎只发生在某些机器上。
我看过这两篇文章:http: //csharpindepth.com/Articles/General/Singleton.aspx
http://csharpindepth.com/Articles/General/BeforeFieldInit.aspx
这揭示了一些见解,但都没有涉及继承如何影响事物。
c++ - 模板专业化/初始化和命名空间?
C++ 关于模板专业化和命名空间限定的规则是什么?我有一些代码可以归结为以下内容,这让我意识到我不了解 C++ 关于模板专业化初始化的规则。首先对我来说似乎很奇怪,g::F<>
甚至允许内部的专业化h
,但鉴于此,我不知道为什么事情会以他们的方式行事。
最后一个实例化/初始化,其中模板静态成员初始化器推断g
命名空间,使模板看起来好像初始化器在代码中与模板定义本身位于同一位置。
规范这种行为的规则是什么?(请注意,这是在 gcc 4.8.1 上测试的,到目前为止看起来有点像一个错误......)
c - MISRA 9.2 初始化浮点数和无符号数组
在以下几行中,我收到了来自 Parasoft C/C++ 测试静态分析工具和 IAR Embedded Workbench MISRA 检查器报告的不同问题:
Parasoft 静态分析 说:
IAR Embedded Workbench 对上述语句没有任何问题(并且其 MISRA 检查器已打开)。
我可以使变量“array_b”的消息消失:
但是,同样的技巧不适用于“array_a”:
现在 IAR Embedded Workbench MISRA 检查器正在抱怨,因为有符号整数常量 0 被分配给无符号整数:
Parasoft 静态分析未显示上述第 4 行的任何问题。
我相信这归结为 MISRA 规则 9.2 对“零”的解释:
例外
哪个检查器是正确的?
java - 外部类中的静态初始化程序是否保证在内部枚举初始化之前运行?
我正在尝试从配置文件中加载一些日志消息,但我仍然想通过 an 引用他们的名字,而不是在将他们的名字输入为senum
时打开自己的印刷错误。String
所以这是我的设置:
我担心的是,可能存在一些边缘场景,其中静态初始化程序在s 初始化Log
之前没有运行。enum
我已经测试了代码,到目前为止它工作正常,而且,从逻辑上讲,我看不出静态初始化程序是如何不首先运行的(因为引用Message
必须通过Log
,例如Log.Message.IOEXCEPTION
)。不过,我对设置有点不安,不想给应用程序崩溃留下任何可能的漏洞。那么,这样安全吗?