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

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(使用前将#替换为@)

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

  • EF Core Group By 翻译支持条件总和

    听说 EF Core 2 1 将支持翻译小组 我感到非常兴奋 我下载了预览版并开始测试它 但发现我在很多地方仍然没有得到翻译分组 在下面的代码片段中 对 TotalFlagCases 的查询将阻止翻译分组工作 无论如何 我可以重写这个以便我
  • 如何使用 C# 中的参数将用户重定向到 paypal

    如果我有像下面这样的简单表格 我可以用它来将用户重定向到 PayPal 以完成付款
  • 在结构中使用 typedef 枚举并避免类型混合警告

    我正在使用 C99 我的编译器是 IAR Embedded workbench 但我认为这个问题对于其他一些编译器也有效 我有一个 typedef 枚举 其中包含一些项目 并且我向该新类型的结构添加了一个元素 typedef enum fo
  • 在哪里可以找到列出 SSE 内在函数操作的官方参考资料?

    是否有官方参考列出了 GCC 的 SSE 内部函数的操作 即 头文件中的函数 除了 Intel 的 vol 2 PDF 手册外 还有一个在线内在指南 https www intel com content www us en docs in
  • 不支持将数据直接绑定到存储查询(DbSet、DbQuery、DbSqlQuery)

    正在编码视觉工作室2012并使用实体模型作为我的数据层 但是 当页面尝试加载时 上面提到的标题 我使用 Linq 语句的下拉控件往往会引发未处理的异常 下面是我的代码 using AdventureWorksEntities dw new
  • 类模板参数推导 - clang 和 gcc 不同

    下面的代码使用 gcc 编译 但不使用 clang 编译 https godbolt org z ttqGuL template
  • 如何从 appsettings.json 文件中的对象数组读取值

    我的 appsettings json 文件 StudentBirthdays Anne 01 11 2000 Peter 29 07 2001 Jane 15 10 2001 John Not Mentioned 我有一个单独的配置类 p
  • 将 VSIX 功能添加到 C# 类库

    我有一个现有的单文件生成器 位于 C 类库中 如何将 VSIX 项目级功能添加到此项目 最终目标是编译我的类库项目并获得 VSIX 我实际上是在回答我自己的问题 这与Visual Studio 2017 中的单文件生成器更改 https s
  • C#中如何移动PictureBox?

    我已经使用此代码来移动图片框pictureBox MouseMove event pictureBox Location new System Drawing Point e Location 但是当我尝试执行时 图片框闪烁并且无法识别确切
  • 带动态元素的 WPF 启动屏幕。如何?

    我是 WPF 新手 我需要一些帮助 我有一个加载缓慢的 WPF 应用程序 因此我显示启动屏幕作为权宜之计 但是 我希望能够在每次运行时更改屏幕 并在文本区域中显示不同的引言 这是一个生产力应用程序 所以我将使用非愚蠢但激励性的引言 当然 如
  • 对现有视频添加水印

    我正在寻找一种用 C 在视频上加水印的方法 就像在上面写文字一样 图片或文字标签 我该怎么做 谢谢 您可以使用 Nreco 视频转换器 代码看起来像 NReco VideoConverter FFMpegConverter wrap new
  • 向现有 TCP 和 UDP 代码添加 SSL 支持?

    这是我的问题 现在我有一个 Linux 服务器应用程序 使用 C gcc 编写 它与 Windows C 客户端应用程序 Visual Studio 9 Qt 4 5 进行通信 是什么very在不完全破坏现有协议的情况下向双方添加 SSL
  • 如何从两个不同的项目中获取文件夹的相对路径

    我有两个项目和一个共享库 用于从此文件夹加载图像 C MainProject Project1 Images 项目1的文件夹 C MainProject Project1 Files Bin x86 Debug 其中有project1 ex
  • 如何将带有 IP 地址的连接字符串放入 web.config 文件中?

    我们当前在 web config 文件中使用以下连接字符串 add name DBConnectionString connectionString Data Source ourServer Initial Catalog ourDB P
  • C# 模拟VolumeMute按下

    我得到以下代码来模拟音量静音按键 DllImport coredll dll SetLastError true static extern void keybd event byte bVk byte bScan int dwFlags
  • IEnumreable 动态和 lambda

    我想在 a 上使用 lambda 表达式IEnumerable
  • 哪种 C 数据类型可以表示 40 位二进制数?

    我需要表示一个40位的二进制数 应该使用哪种 C 数据类型来处理这个问题 如果您使用的是 C99 或 C11 兼容编译器 则使用int least64 t以获得最大的兼容性 或者 如果您想要无符号类型 uint least64 t 这些都定
  • 如何将服务器服务连接到 Dynamics Online

    我正在修改内部管理应用程序以连接到我们的在线托管 Dynamics 2016 实例 根据一些在线教程 我一直在使用OrganizationServiceProxy out of Microsoft Xrm Sdk Client来自 SDK
  • C++ 中类级 new 删除运算符的线程安全

    我在我的一门课程中重新实现了新 删除运算符 现在我正在使我的代码成为多线程 并想了解这些运算符是否也需要线程安全 我在某处读到 Visual Studio 中默认的 new delete 运算符是线程安全的 但这对于我的类的自定义 new
  • 如何防止用户控件表单在 C# 中处理键盘输入(箭头键)

    我的用户控件包含其他可以选择的控件 我想实现使用箭头键导航子控件的方法 问题是家长控制拦截箭头键并使用它来滚动其视图什么是我想避免的事情 我想自己解决控制内容的导航问题 我如何控制由箭头键引起的标准行为 提前致谢 MTH 这通常是通过重写

随机推荐

  • 如何使用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 允许实现将具有静态或线程存储持续时间的变量初始化作为静态初始化 即使不需要静态完成此类初始化 前提是 初始化的动态版本不会更改初始化之前任何其他静态或线程存