保证静态对象的静态(常量)初始化

2024-05-17

最重要的问题是:程序员如何确保他的非局部静态变量是通过静态初始化而不是通过动态初始化来初始化的?

由于总是进行零初始化,因此应该查看常量初始化。

3.6.2.2 对象 o 的常量初始值设定项是一个常量表达式,只不过它也可以调用 constexpr o 及其子对象的构造函数,即使这些对象是 非文字类类型 [ 注意:这样的类可能有一个不平凡的 析构函数——尾注]。执行常量初始化:

— 如果每个完整表达式(包括隐式转换) 出现在静态或线程引用的初始值设定项中 存储持续时间是一个常量表达式(5.19),引用是 绑定到指定具有静态存储持续时间的对象的左值 或临时的(见12.2);

— 如果具有静态或线程存储持续时间的对象是已初始化 通过构造函数调用,并且如果初始化完整表达式是 对象的常量初始值设定项;

— 如果具有静态或线程存储持续时间的对象是不是 由构造函数调用初始化,并且如果该对象是 值初始化 or 其中出现的每一个完整表达式 初始化器是一个常量表达式.

我省略了参考文献,因为它对我来说并不重要。如何I理解的标准是有3种情况:

  1. ctor
  2. 无向量和值初始化
  3. 无向量和常量表达式

假设我有以下课程:

struct X {
  bool flag = false;
  // = {} will break VS2013 CTP so in that case use the
  // regular ctor, which sadly still can't be declared constexpr
  std::aligned_storage<sizeof(int), alignof(int)>::type storage = {};
};

据我所知,这个类对于常量初始化是完全有效的(每个元素都可以不断地初始化)。这是真的?

这个类需要一个constexpr构造函数?

C++11 和 C++98 是否保证常量初始化?

附带问题:so/dll 的静态初始化何时完成?在加载期间,或者可能会进一步延迟?


最好知道这个问题背后的目的。还有您关心的是分配还是具体的初始化。

但是,初始化的类型并不重要,因为所需的空间是在编译时分配的。根据您定义变量的方式,它将最终出现在 .bss 或 .data 部分中。

初始化,正如你所知,只是为了在第一次使用内存之前确保内存中的特定内容。如果您没有定义分配动态内存的构造函数,那么将不会有任何动态分配(如果这是您关心的问题)。

对于简单的构造函数,我相信编译器将生成内联代码并使用相同的代码在编译时初始化对象(我不确定标准谈论了什么,但它可能依赖于工具链。) ,非局部静态对象将在图像加载到内存中时初始化,局部静态对象将在加载堆栈帧时初始化。在任何情况下,您应该在首次使用之前找到处于已知状态的对象。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

保证静态对象的静态(常量)初始化 的相关文章

  • 在 LINQ 查询中返回不带时间的日期

    我正在编写一个查询 我想计算按日期联系我们的呼叫中心的次数 看起来很简单 但由于联系日期字段是日期时间字段 我得到了时间 因此当我按联系日期 时间 分组时 每个联系日期实例的计数为 1 所以 我想只按日期分组 而不按时间分组 下面是我用来查
  • Signalr 在生产服务器中总是陷入长轮询

    当我在服务器中托管应用程序时 它会检查服务器端事件并始终回退到长轮询 服务器托管环境为Windows Server 2012 R1和IIS 7 5 无论如何 我们是否可以解决这个问题 https cloud githubuserconten
  • C# 中值类型和引用类型有什么区别? [复制]

    这个问题在这里已经有答案了 我知道一些差异 值类型存储在堆栈上 而引用类型存储在托管堆上 值类型变量直接包含它们的值 而引用变量仅包含对托管堆上创建的对象位置的引用 我错过了任何其他区别吗 如果是的话 它们是什么 请阅读 堆栈是一个实现细节
  • 如何在 WPF RichTextBox 中跟踪 TextPointer?

    我正在尝试了解 WPF RichTextBox 中的 TextPointer 类 我希望能够跟踪它们 以便我可以将信息与文本中的区域相关联 我目前正在使用一个非常简单的示例来尝试弄清楚发生了什么 在 PreviewKeyDown 事件中 我
  • 如何针对 Nancy 中的 Active Directory 进行身份验证?

    这是一篇过时的文章 但是http msdn microsoft com en us library ff650308 aspx paght000026 step3 http msdn microsoft com en us library
  • C# 用数组封送结构体

    假设我有一个类似于 public struct MyStruct public float a 我想用一些自定义数组大小实例化一个这样的结构 在本例中假设为 2 然后我将其封送到字节数组中 MyStruct s new MyStruct s
  • HttpClient 像浏览器一样请求

    当我通过 HttpClient 类调用网站 www livescore com 时 我总是收到错误 500 可能服务器阻止了来自 HttpClient 的请求 1 还有其他方法可以从网页获取html吗 2 如何设置标题来获取html内容 当
  • 当 Cortex-M3 出现硬故障时如何保留堆栈跟踪?

    使用以下设置 基于 Cortex M3 的 C gcc arm 交叉工具链 https launchpad net gcc arm embedded 使用 C 和 C FreeRtos 7 5 3 日食月神 Segger Jlink 与 J
  • 在 ASP.Net Core 2.0 中导出到 Excel

    我曾经使用下面的代码在 ASP NET MVC 中将数据导出到 Excel Response AppendHeader content disposition attachment filename ExportedHtml xls Res
  • A* 之间的差异 pA = 新 A;和 A* pA = 新 A();

    在 C 中 以下两个动态对象创建之间的确切区别是什么 A pA new A A pA new A 我做了一些测试 但似乎在这两种情况下 都调用了默认构造函数 并且仅调用了它 我正在寻找性能方面的任何差异 Thanks If A是 POD 类
  • 线程、进程和 Application.Exit()

    我的应用程序由主消息循环 GUI 和线程 Task Factory 组成 在线程中我调用一些第三方应用程序var p new Process 但是当我调用Application Exit 在消息循环中 我可以看到在线程中启动的进程仍在内存中
  • 初始化变量的不同方式

    在 C 中初始化变量有多种方法 int z 3 与 int 相同z 3 Is int z z 3 same as int z z 3 您可以使用 int z z 3 Or just int z 3 Or int z 3 Or int z i
  • Windows 10 中 Qt 桌面应用程序的缩放不当

    我正在为 Windows 10 编写一个简单的 Qt Widgets Gui 应用程序 我使用的是 Qt 5 6 0 beta 版本 我遇到的问题是它根本无法缩放到我的 Surfacebook 的屏幕上 这有点难以判断 因为 SO 缩放了图
  • 网络参考共享类

    我用 Java 编写了一些 SOAP Web 服务 在 JBoss 5 1 上运行 其中两个共享一个类 AddressTO Web 服务在我的 ApplycationServer 上正确部署 一切都很顺利 直到我尝试在我的 C 客户端中使用
  • 在 URL 中发送之前对特殊字符进行百分比编码

    我需要传递特殊字符 如 等 Facebook Twitter 和此类社交网站的 URL 为此 我将这些字符替换为 URL 转义码 return valToEncode Replace 21 Replace 23 Replace 24 Rep
  • 将日期参数传递给对 MVC 操作的 ajax 调用的安全方法

    我有一个 MVC 操作 它的参数之一是DateTime如果我通过 17 07 2012 它会抛出一个异常 指出参数为空但不能有空值 但如果我通过01 07 2012它被解析为Jan 07 2012 我将日期传递给 ajax 调用DD MM
  • 如何构建印度尼西亚电话号码正则表达式

    这些是一些印度尼西亚的电话号码 08xxxxxxxxx 至少包含 11 个字符长度 08xxxxxxxxxxx 始终以 08 开头 我发现这个很有用 Regex regex new Regex 08 0 9 0 9 0 9 0 9 0 9
  • 如何在内存中存储分子?

    我想将分子存储在内存中 这些可以是简单的分子 Methane CH4 C H bond length 108 7 pm H H angle 109 degrees But also more complex molecules like p
  • 窗体最大化时自动缩放子控件

    有没有办法在最大化屏幕或更改分辨率时使 Windows 窗体上的所有内容自动缩放 我发现手动缩放它是正确的 但是当切换分辨率时我每次都必须更改它 this AutoScaleDimensions new System Drawing Siz
  • 将变量分配给另一个变量,并将一个变量的更改反映到另一个变量中

    是否可以将一个变量分配给另一个变量 并且当您更改第二个变量时 更改会瀑布式下降到第一个变量 像这样 int a 0 int b a b 1 现在 b 和 a 都 1 我问这个问题的原因是因为我有 4 个要跟踪的对象 并且我使用名为 curr

随机推荐