如何理解在某些情况下允许实现将非局部变量的动态初始化视为静态初始化?

2023-11-30

其实问题出自标准草案N4582中的一句话:

[basic.start.static/3] 允许实现将具有静态或线程存储持续时间的变量初始化作为静态初始化,即使不需要静态完成此类初始化,前提是:

— 初始化的动态版本不会更改初始化之前任何其他静态或线程存储持续时间的对象的值,并且

— 如果不需要静态初始化的所有变量都被动态初始化,则初始化的静态版本在初始化变量中生成的值与动态初始化生成的值相同。

这些词是否意味着,如果满足这两个条件,类类型的非局部变量可以完全静态初始化(零初始化),以便不调用其构造函数(因为动态版本,通过调用构造函数进行初始化,可以被静态版本替换)?


静态初始化在编译/链接期间执行。编译器/链接器在静态内存中为变量分配一个位置,并用正确的字节填充它(字节不需要全为零)。当程序启动时,静态内存的这些区域将从程序的二进制文件中加载,并且不需要进一步的初始化。

例子:

namespace A {
    // statically zero-initialized
    int a;
    char buf1[10];

    // non-zero initialized
    int b = 1;
    char date_format[] = "YYYY-MM-DD";
}

与静态初始化不同,动态初始化需要在程序启动后运行一些代码,以将初始化的变量设置为其初始状态。需要运行的代码不需要是构造函数调用。

例子:

namespace B {
    int a = strlen(A::date_format);   (1)
    int b = ++a;                      (2)

    time_t t = time();                (3)

    struct C {
        int i;

        C() : i(123) {}
    };

    C c;                              (4)

    double s = std::sqrt(2);          (5)
}

现在,C++ 标准允许编译器执行在动态初始化期间执行的计算,前提是这些计算没有副作用。此外,这些计算不能依赖于外部环境。在上面的例子中:

(1) 可以静态执行,因为strlen()没有任何副作用。

(2) 必须保持动态,因为它会发生变化a.

(3) 必须保持动态,因为它依赖于外部环境/进行系统调用。

(4)可以静态地进行。

(5) 有点棘手,因为浮点计算取决于 FPU 的状态(即舍入模式)。如果告诉编译器不要那么认真地对待浮点运算,那么它可以静态执行。

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

如何理解在某些情况下允许实现将非局部变量的动态初始化视为静态初始化? 的相关文章

随机推荐

  • 如何使用midlrt.exe将.idl编译为.winmd?

    背景 我需要构建一个 Windows 运行时组件作为设置为使用的系统的一部分CMake生成其构建系统 作为准备步骤 我尝试在命令行上构建它 从简单的 idl 文件 MyType idl 开始 namespace NS default int
  • cookie / MAMP / CodeIgniter 的问题

    我在使用 MAMP 和 Codeigniter 读取本地主机上的 cookie 时遇到问题 我正在尝试使用 cookie 来验证对管理区域的访问 我可以设置 cookie 我在浏览器上看到它 Chrome 但在授予访问权限后我无法读取它 我
  • 接受 Java 中的证书

    我在通过 Java 与 HTTPS 站点交互时遇到问题 我的程序每次运行时都会使用一个带有不受信任证书的 URL 该程序必须在多个系统上运行 目前 我有以下内容 public class A HostnameVerifier hv new
  • Google 日历 API - 未从 Execute() C# 返回

    运行下面的代码永远不会从执行函数返回 我的个人 Gmail 帐户上有一个私人日历 已与developer gserviceaccount com 帐户共享 查看 API 管理器 用法 引用显示我已经使用过甚至点击了该 API 任何想法表示赞
  • 将非结构化 csv 文件转换为数据框

    我正在学习 R 用于文本挖掘 我有一个 CSV 格式的电视节目表 节目通常从早上 06 00 开始 一直持续到第二天凌晨 05 00 称为播出日 例如 2015 年 11 月 15 日的节目从早上 06 00 开始 到次日凌晨 05 00
  • 在Java中,如何测试对象的监视器是否被锁定? [复制]

    这个问题在这里已经有答案了 在Java中 如何测试对象的监视器是否被锁定 换句话说 给定一个对象 obj 是否有任何线程拥有 obj 的监视器 我不关心哪个线程拥有监视器 我需要测试的是是否有任何线程拥有给定对象的监视器 由于当前线程以外的
  • 如何在 React 中将多个浏览器特定值添加到 CSS 样式中?

    这主要是为了给定的 CSS 属性定义浏览器特定值 如下所示 div Grab me div 如果我将它包装成这样的对象 div Grab me div 然后您复制对象中的键 在严格模式下会失败 否则会覆盖 并且简单地将所有值放入单个字符串中
  • 应用配色方案

    我正在为现有应用程序开发一个新的 UI 目前使用 VB6 并且被告知要使其看起来更好 更漂亮 有没有什么地方可以让我获得一些关于商业应用程序的配色方案 非 25 度灰度 的好主意 仅供参考 我在 WPF 工作 检查这个应用 用于拍摄配色方案
  • 将 json 反序列化为键值对列表

    我有以下 json key key1 value val1 key key2 value val2 我如何将其反序列化为列表 数组NameValuePair
  • 更新 sqlite 中的查询

    活动代码 String MMS SELECT Name FROM UserData WHERE MessagesSent SELECT max MessagesSent FROM UserData db execSQL UPDATE Mai
  • 关于 MPI_Scatter 执行器及其发送缓冲区分配的问题

    我的第一个想法是MPI Scatter和发送缓冲区分配应该用于if proc id 0 子句 因为数据应该只分散一次 并且每个进程只需要发送缓冲区中的一部分数据 但是它无法正常工作 看来发送缓冲区分配和MPI Scatter在应用程序正常运
  • 从 php 中的 url 获取 #

    我正在尝试使用 facebook API 进行编码 这里说 http developers facebook com docs authentication javascript获取 access token 的东西 但它是在 而不是 之后
  • 如何将数据帧转换为标签特征向量?

    我正在 scala 中运行逻辑回归模型 并且有一个如下所示的数据框 df x y 0 0 0 33 0 58 0 96 0 1 1 21 0 10 0 65 1
  • Intel 和 AMD 如何不同但仍然兼容?

    正如我一直以来的理解 AMD 通过逆向工程英特尔的指令集来构建他们的 CPU 现在向英特尔付费以使用他们的指令集 而英特尔对 AMD 的 64 位指令也做了同样的事情 这就是 Windows 可以在两种类型的 CPU 上安装而无需购买特定版
  • Perl 中哈希键的字符串比较

    我在 Perl 中有一个哈希映射 如下所示 MAP MESSAGE TO NUMBER gt Hello World I am XYZ gt 11 I am using Stack Overflow for Guidance gt 12 P
  • 以编程方式检测 iPad/iPhone 硬件的最佳方法

    我需要找出的原因是 在 iPad 上 UIPickerView 在横向和纵向上具有相同的高度 在 iPhone 上情况有所不同 iPad 编程指南向 UIDevice 引入了一个 idiom 值 UIDevice thisDevice UI
  • mvc 中 AJAX 上传脚本的问题

    我在这里找到了这个ajax文件上传脚本http www phpletter com Demo AjaxFileUpload Demo 应该将 ajax 功能添加到我的文件上传表单中 div title Upload Image Select
  • 根据 Google 表格中的单元格值将行复制到另一张表格

    我正在尝试 FILTER Orginal A D Orginal D D Complete Screens 我有错误 公式分析错误 我做错了什么 您在这里遇到语法错误 请使用以下公式 FILTER Orginal A2 D Orginal
  • Access-Control-Allow-Origin 未显示在 codeigniter 的响应标头中

    我的 Codeigniter 文件说 CI gt output gt set header Access Control Allow Origin CI gt output gt set header Access Control Expo
  • 如何理解在某些情况下允许实现将非局部变量的动态初始化视为静态初始化?

    其实问题出自标准草案N4582中的一句话 basic start static 3 允许实现将具有静态或线程存储持续时间的变量初始化作为静态初始化 即使不需要静态完成此类初始化 前提是 初始化的动态版本不会更改初始化之前任何其他静态或线程存