C++ 全局初始化可以有多懒?

2024-03-07

我习惯于认为全局/静态类成员的所有初始化都发生在 main() 的第一行之前。但我最近在某处读到该标准允许稍后进行初始化以“协助模块的动态加载”。在动态链接时我可以看到这是真的:我不希望在 dlopen 库之前初始化库中初始化的全局变量。然而,在一组静态链接在一起的翻译单元(我的应用程序的直接 .o 文件)中,我会发现这种行为非常不直观。这仅在动态链接时才延迟发生还是可以随时发生? (或者我读到的内容是错误的?;)


该标准在3.6.2/3中有以下内容:

对象的动态初始化(8.5、9.4、12.1、12.6.1)是实现定义的 命名空间作用域在 main 的第一条语句之前完成。如果初始化被推迟到某个时间点 在 main 的第一个语句之后,它应在第一次使用定义的任何函数或对象之前发生 与要初始化的对象位于同一翻译单元中。

But o Of course you can never officially tell when the initialization takes place since the initialization will occur before you access the variable! as follows:

// t1.cc
#include <iostream>
int i1 = 0;

int main () {
  std::cout << i1 << std::endl

// t2.cc
extern int i1;
int i2 = ++i1;

我可以确认 g++ 4.2.4 至少看起来在 main 之前执行了“i2”的初始化。

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

C++ 全局初始化可以有多懒? 的相关文章

  • 如何使用 MVVM 更新 WPF 中编辑的数据? [复制]

    这个问题在这里已经有答案了 我正在为聊天应用程序构建 UI 设计 在尝试更新所选联系人的消息时遇到问题 选择现有联系人 选择编辑选项 然后编辑其属性 例如用户名和图像 后 唯一进行的更改是联系人的用户名和图像 我仍然想更改 MessageM
  • Java - 同步方法导致程序大幅减慢

    我正在尝试了解线程和同步 我做了这个测试程序 public class Test static List
  • 找到的程序集的清单定义与程序集引用不匹配

    我试图在 C Windows 窗体应用程序 Visual Studio 2005 中运行一些单元测试 但出现以下错误 System IO FileLoadException 无法加载文件或程序集 实用程序 版本 1 2 0 200 文化 中
  • 如何在不实例化一个类的情况下检查它是否继承了另一个类? [复制]

    这个问题在这里已经有答案了 假设我有一个如下所示的类 class Derived some inheritance stuff here 我想在我的代码中检查类似的内容 Derived is SomeType 但看起来像is运算符需要 De
  • 如何在编译C代码时禁用警告?

    我正在使用 32 位 Fedora 14 系统 我正在使用编译我的源代码gcc 有谁知道如何在编译c代码时禁用警告 EDIT 是的 我知道 最好的办法是修复这些警告以避免任何未定义 未知的行为 但目前在这里 我第一次编写了巨大的代码 并且在
  • Qt 计算和比较密码哈希

    目前正在 Qt 中为测验程序构建面向 Web 的身份验证服务 据我了解 在数据库中存储用户密码时 必须对其进行隐藏 以防落入坏人之手 流行的方法似乎是添加的过程Salt https en wikipedia org wiki Salt cr
  • 存储过程上的 OdbcCommand - 输出参数上出现“未提供参数”错误

    我正在尝试执行存储过程 通过 ODBC 驱动程序针对 SQL Server 2005 但收到以下错误 过程或函数 GetNodeID 需要参数 ID 但未提供该参数 ID 是我的过程的 OUTPUT 参数 在存储过程中指定了一个输入 mac
  • 手动将 ClientBase 集合类型从 Array[] 更改为 List<>

    我将自己的 WCF 代理与 Client Base 一起使用 我想做一些类似于 svc util 中的 ct 属性的操作 并告诉代理返回 List 集合类型 我不能使用 List 因为实体由 nhibernate 管理 所以我必须使用 IL
  • 操纵 setter 以避免 null

    通常我们有 public string code get set 如果最终有人将代码设置为 null 我需要避免空引用异常 我尝试这个想法 有什么帮助吗 public string code get set if code null cod
  • 防止GDB中的PLT(过程链接表)断点

    在最新版本的 GDB 中 在库函数调用上设置断点会导致多个实际断点 调用过程链接表 PLT 实际的函数调用 这意味着当调用库函数时 我们每次都会经历两次中断 在以前的 GDB 版本中 只会创建 2 因此您只能得到一次中断 那么问题来了 是否
  • 静态链接共享对象?或者损坏的文件?

    我有一个从专有来源获得的库 我正在尝试链接它 但出现以下错误 libxxx so 文件无法识别 文件格式无法识别 Collect2 ld 返回 1 退出状态 确实 ldd libxxx so statically linked 这究竟意味着
  • 在简单注入器中注册具有多个构造函数和字符串依赖项的类型

    我正在尝试弄清楚如何使用 Simple Injector 我在项目中使用了它 注册简单服务及其组件没有任何问题 但是 当组件具有两个以上实现接口的构造函数时 我想使用依赖注入器 public DAL IDAL private Logger
  • 如何用 C 语言练习 Unix 编程?

    经过五年的专业 Java 以及较小程度上的 Python 编程并慢慢感觉到我的计算机科学教育逐渐消失 我决定要拓宽我的视野 对世界的一般用处 并做一些 对我来说 感觉更重要的事情就像我真的对机器有影响一样 我选择学习 C 和 Unix 编程
  • 系统错误 124 - SHFileOperation 的 ERROR_INVALID_LEVEL

    我在使用时遇到问题SHFileOperation SHFileOperation SHFILEOPSTRUCT https stackoverflow com questions 9191415 shfileoperation shfile
  • 从事务范围调用 WCF 服务方法

    我有这样的代码 using TransactionScope scope TransactionScopeFactory CreateTransactionScope some methodes calls for which scope
  • 正确使用“extern”关键字

    有一些来源 书籍 在线材料 解释了extern如下 extern int i declaration has extern int i 1 definition specified by the absence of extern 并且有支
  • 设计 Javascript 前端 <-> C++ 后端通信

    在我最近的将来 我将不得不制作一个具有 C 后端和 Web 前端的系统 要求 目前 我对此了解不多 我认为前端将触发数据传输 而不是后端 所以不需要类似 Comet 的东西 由于在该领域的经验可能很少 我非常感谢您对我所做的设计决策的评论
  • 如何使用收益返回和递归获得字母的每个组合?

    我有几个像这样的字符串列表 可能有几十个列表 1 A B C 2 1 2 3 3 D E F 这三个仅作为示例 用户可以从几十个具有不同数量元素的类似列表中进行选择 再举个例子 这对于用户来说也是一个完全有效的选择 25 empty 4 1
  • 从 C 线程调用 Python 代码

    我对从 C 或 C 线程调用 Python 代码时如何确保线程安全感到非常困惑 The Python 文档 http docs python org c api init html non python created threads似乎是
  • #pragma pack(16) 和 #pragma pack(8) 的效果总是相同吗?

    我正在尝试使用来对齐数据成员 pragma pack n http msdn microsoft com en us library 2e70t5y1 28v vs 100 29 aspx 以下面为例 include

随机推荐

  • 如何在Spring + JSP中创建超链接

    在 Spring JSP 中创建超链接的正确方法是什么 一定有比仅仅在代码中编码更好的方法 a href 标签 以显示人员的页面为例 网址是people htm 相应的控制器从数据库中获取人员并执行可选的列排序 JSP 可能如下所示 tab
  • Shiro 向 DefaultSecurityManager 抱怨“没有 id xxx 的会话”

    我在一个长期运行的应用程序中使用 Apache Shiro 1 2 0 该应用程序从队列中读取消息并采取操作 所采取的操作需要 Shiro 进行身份验证的会话 因此我实现了一个 ActAsAuthenticationToken 和自定义凭据
  • 在 Google Cloud Function 或 AWS Lambda 上部署 Universal Angular

    在尝试 Angular 2 时 我碰巧请参阅角度通用 https universal angular io quickstart 它是 Angular 2 应用程序的服务器端渲染 就像我们在 ReactJs 中一样 还有一份包含一个代码片段
  • 如何强制 SQL Server Management Studio 使用 64 位导入向导以避免错误:Microsoft.ACE.OLEDB.12.0 提供程序未注册

    我安装了 64 位操作系统和 64 位 Office 我已经安装了 MS Data Access 组件 尝试了各种版本 64 位 32 位 我无法让 SSMS 导入 Excel 文件 我收到错误 Microsoft ACE OLEDB 12
  • 选出五个总和为 S 的数字

    给定一个数组A of N非负数 我有兴趣找到可以选择 5 个数字 从数组中的不同位置 的方法数 使得它们的总和为S 有一个简单的解决方案O N 3 Let H be a hash table of sum position of leftm
  • 找到notepad.exe和mspaint.exe的路径

    找出可在不同版本的 Windows 上运行的 notepad exe 和 mspaint exe 所在位置的最佳方法是什么 我应该通过以下方式获取 Windows 目录吗SHGetFolderPath NULL CSIDL WINDOWS
  • Firebase 注销用户所有会话

    我在我的 iOS 应用程序中使用 Firebase 身份验证 当用户使用 Firebase 登录我的应用程序然后注销该用户的所有其他设备 会话 时 Firebase 有什么方法吗 我可以使用 Firebase 管理 SDK 来做到这一点吗
  • 如何使用 Go 不将空结构封送到 JSON 中?

    我有一个这样的结构 type Result struct Data MyStruct json data omitempty Status string json status omitempty Reason string json re
  • 谷歌分析:dataLayer.push 不起作用?

    基于此线程 使用 Google 跟踪代码管理器跟踪事件 https stackoverflow com questions 18192982 tracking events using google tag manager 18194823
  • 使用 GL_POLYGON 绘制圆的纹理映射

    我正在尝试使用将纹理映射到圆形GL POLYGON使用此代码 void drawCircleOutline Circle c int textureindex float angle radian x y values needed by
  • 如何在主窗体之前显示设置配置的窗体?

    在我的项目中我有两个表单 form1 form2 form1是配置表单 我想显示 Form1 当我们单击 Button1 时 然后显示 Form2 和释放 释放 Form1 我该怎么做 我用这个代码 但是这个项目启动然后自动退出 一位朋友说
  • 双打会遭受溢出吗?

    双精度浮点数或浮点数是否可能发生溢出 环绕 如果在 x86 或 x64 硬件上达到最大值 或最小值 会发生什么情况 在符合 IEEE 754 标准的系统上 溢出会导致特殊的 无穷大 或 负无穷大 值 超过该值 任何进一步的增量都将不起作用
  • 词汇分散图是seaborn

    我正在使用 seaborn 模块来生成类似于下面示例的图 import pandas as pd import matplotlib pyplot as plt import numpy as np import seaborn as sn
  • 如何将特定文件类型从一个文件夹复制到另一个文件夹

    如何将特定文件类型从一个文件夹复制到另一个文件夹 同时保留文件夹结构 以下批处理命令能够将特定文件类型复制到文件夹 但无法保留文件夹结构 for R c source f in cpp h do copy f x destination 我
  • 每个 Java 应用程序是否有一个 JVM?

    所有运行的 Java 应用程序都使用相同的 JVM 还是 每个 Java 应用程序一个 JVM 适用 假设应用程序是 IntelliJ IDEA 服务器和 NetBeans 此外 每个Java应用程序分配的JVM和使用的进程之间是否有任何联
  • AS3 - 缩放位图数据

    我想将 BitmapData 缩放到不同的大小 例如 200 400 600 和 800 有什么好的方法可以做到这一点 你不能直接缩放BitmapData但你可以对其进行缩放克隆 这是一个缩放的简单示例BitmapData package
  • 在 pkg-config 搜索路径中找不到 OpenCV 包

    我已经按照中的说明安装了 OpenCVhttps help ubuntu com community OpenCV https help ubuntu com community OpenCV sudo su sudo apt get in
  • 检索当前正在运行的应用程序的导航历史记录

    我想要一种方法来向用户显示他当前在应用程序中的位置 例如 如果我有activity A activity B activity C等等 如果他导航到activity E 例如 他应该能够看到他如何登陆当前屏幕的历史记录 从Home gt E
  • ASP.Net MVC 4 捆绑包

    我见过的很多代码都引用了这个 section Scripts Scripts Render bundles jqueryval 这很棒 而且它可以工作 如果包含 某些东西 我是否必须添加参考才能获取这些 使用 NuGet 复制 DLL 这是
  • C++ 全局初始化可以有多懒?

    我习惯于认为全局 静态类成员的所有初始化都发生在 main 的第一行之前 但我最近在某处读到该标准允许稍后进行初始化以 协助模块的动态加载 在动态链接时我可以看到这是真的 我不希望在 dlopen 库之前初始化库中初始化的全局变量 然而 在