静态变量的动态初始化阶段

2023-11-30

该标准特别指出,静态持续时间变量(命名空间范围和类静态成员)的动态初始化不必在执行 main 之前发生: “命名空间范围的对象的动态初始化(8.5、9.4、12.1、12.6.1)是否在 main 的第一个语句之前完成,是由实现定义的。” IS 3.6.2(3) 动态初始化不是[总是?] 实现的吗?有什么更好/更简单的方法来保证对象在使用前初始化?


您的问题的答案位于您引用的句子之后的下一句(ISO/IEC 14882-2003 的 3.6.2 中)。

是否由实现定义 或者不是动态初始化 对象的(8.5、9.4、12.1、12.6.1) 命名空间范围是在之前完成的 main 的第一个语句。如果 初始化被推迟到一些 第一个之后的时间点 main 的声明,它会发生 在第一次使用任何功能之前 或相同定义的对象 翻译单元作为对象 已初始化。

显然是为了确保某些变量X已初始化,您只需在函数中使用main(直接或间接)与变量在同一翻译单元中定义的任何函数或变量X(例如,如果您直接或间接使用X在功能上main那么您可以确定它已经初始化)。

EDIT:

如果除了保证您使用的变量已经初始化(它总是如此 - 正如上面引用的标准文本所保证的那样)之外,您还想知道为什么标准包含初始化可能会延迟的规定main执行开始。

我的意思是如果问题也是:为什么不直接要求所有初始化都在之前执行main starts?

嗯,这绝对不是关于动态链接库 - 在开始之前初始化所有对象没有问题main。这也不是关于动态加载图书馆(LoadLibrary/dlopen) - 它们显然不在 C++ 标准的范围内(例如,它们不受单一定义规则的约束,通常它们甚至可能不是 C++)。

理论上,此规定允许延迟初始化以避免不必要的运行时开销 - 例如除非您实际使用特定翻译单元(C++ 源文件)中的某些函数或对象,否则您不必执行其运行时初始化。但任何实现实际上都不可能在运行时执行延迟初始化 - 多线程同步对于这种初始化来说是一个挑战,并且本身就是一种运行时开销。

BUT每个单独的实现实际上所做的只是链接那些实际使用的模块(翻译单元)。因此,即使您链接到某些包含某些动态初始化对象的静态库(可能会产生副作用 - 例如文件创建或用户交互),但不使用同一翻译单元中的任何内容 - 实现也没有义务运行该对象的初始化根本不。因此,此规定允许避免在最终可执行文件中包含任何未使用的翻译单元 - 即使它们正式是程序的一部分。

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

静态变量的动态初始化阶段 的相关文章

随机推荐

  • Java Unicode 翻译

    我遇到了以下代码 public class LinePrinter public static void main String args Note u000A is unicode for Line Feed char c 0x000A
  • 使用 AutoIT 登录 Chrome 身份验证窗口

    我尝试通过以下代码登录到 Firefox 身份验证窗口 WinWaitActive Authentication Required 120 If WinExists Authentication Required Then Send use
  • 如何找到向量中的所有最小元素

    在Matlab中 通过函数min 即使可以有多个相等的最小元素 我也只能得到一个向量的一个最小元素 我想知道如何获取向量中所有最小元素的索引 例如 v 1 1 我想获得索引 1 和 2 它们都索引最小的元素 1 感谢致敬 您可以使用find
  • fmt.Scanln 预期换行错误

    我正在尝试学习 Go 但坚持了这一点 http ideone com hbCamr or http ideone com OvRw7t package main import fmt func main var i int var f fl
  • Github 表示有效的现有工作“正在等待状态报告”

    我有一个 PR 我希望在合并到 master 之前完成某些检查 这是工作https github com hhimanshu typescript serverless api vercel actions runs 763599870 现
  • 美元符号在 Swift / SwiftUI 中起什么作用?

    Apple 提供的有关 SwiftUI 的教程使用美元符号绑定数据 但我无法在 SwiftUI 中找到有关此数据绑定的更多信息 Toggle isOn showFavoritesOnly 您可以使用 前缀来访问对状态变量或其属性之一的绑定
  • 在通过 setTimeout 或 Promise 阻止代码之前更新 DOM

    我知道 当存在 CPU 密集型代码时 任何先前的 DOM 更新都不会发生 例如 function blockFor dur var now new Date getTime while new Date getTime lt now dur
  • 如何使用serviceWorker缓存ajax响应

    我在index html中使用ajax调用服务器数据 它正在完美地获取这些数据 现在 我正在与服务人员一起工作 我可以缓存所有静态资源 图像 js css 并在 Chrome 开发工具的应用程序选项卡的缓存存储中检查这些缓存的资源 我可以在
  • 使用信用卡付款的 Paypal Express Checkout 订阅

    问题 是否可以通过 Paypal api Express Checkout 设置订阅 以便您可以通过信用卡和 Paypal 登录进行支付 Paypal 登录没问题 但目前无法使用信用卡 我已设置 NVP SOLUTIONTYPE Sole
  • 参数数量无效:没有绑定参数

    我有一个使用 php 和 mysql 的静态聊天应用程序 下面是在聊天框中显示消息的代码 sql SELECT id msg time msg from msg to from msg WHERE msg from SESSION user
  • 使用 GSON 反序列化嵌套 JSON 字符串

    全部 我有以下内容JSON输出 字符串 来自 JIRA API 的响应 expand names schema startAt 0 maxResults 50 total 1 issues expand operations version
  • Java:找到大写字母时分割字符串

    我认为这是一个简单的问题 但我无法找到一个简单的解决方案 比如说 少于 10 行代码 我有一个String例如 thisIsMyString 我需要将其转换为String this Is My String 请注意第一个字母不是大写 您可以
  • Visual Studio代码:在输入代码片段时替换字符大小写

    我正在尝试为 Visual Studio Code 和 TypeScript 编写代码片段 到目前为止 我成功地镜像了这样的输入单词 import 1 Name Component from 1 name component 当我在第 1
  • 集群环境下如何使用redis扫描?

    我正在使用 spring redisTemplate 和 redis 扫描 它可以在单节点的情况下查找 但在集群环境下就不行了 我无法获取数据 有没有办法在集群环境下获取扫描数据 这是我的 spring redisTemplate 代码 S
  • 将一个函数作为参数传递给另一个函数

    我看到一个函数像这样传递 sigma 3 e 2 svmTrain X y gaussianKernel X y sigma 这样的函数传递是怎么回事 有人能解释一下吗 语法 X y gaussianKernel X y sigma 创建一
  • Visual Studio:通过电源控制台添加项目文件失败

    我的任务是在一个解决方案中添加 384 个现有项目 以便用项目依赖项替换二进制文件依赖项并使用 msbuild 进行构建 为了实现这一目标 我尝试使用 Visual Studio API 来自动将项目添加到解决方案中 我实际上是 Windo
  • 如何从画布中添加和删除(多个)图像?

    我是画布 HTML5 新手 我必须在画布上设计一个绘画应用程序 有一个功能 例如在画布上动态添加所选图像 通过鼠标移动 以及删除和拖动添加的图像的功能 与文本添加相同 现在我的问题是我们如何从画布中删除图像 注意 添加到画布中的图像没有固定
  • 如何在TYPO3 CMS后端重命名副标题

    如何为作者重命名 TYPO3 CMS 后端字段 即提到的 csc styled content 内容元素字段 一般来说 覆盖标签名称可以通过后端的 Page TSconfig 来完成 下面的例子修改了标签subheader field TC
  • 你调用的对象是空的

    我有一个单元格类 public class Cell public enum cellState WATER SCAN SHIPUNIT SHOT HIT public Cell currentCell cellState WATER Me
  • 静态变量的动态初始化阶段

    该标准特别指出 静态持续时间变量 命名空间范围和类静态成员 的动态初始化不必在执行 main 之前发生 命名空间范围的对象的动态初始化 8 5 9 4 12 1 12 6 1 是否在 main 的第一个语句之前完成 是由实现定义的 IS 3