问题标签 [zero-initialization]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
98 浏览

c++ - C++ 零初始化具有可变数组长度的模板数组

有没有办法将具有可变大小的任何类型的数组初始化为零?所以我想要的是应用这样的东西:

到这样的模板:

当我尝试这个时,我的编译器会这样说:'results' declared as array of functions of type 'T ()'. 当我使用任何固定类型名时,我会收到此错误:Variable-sized object may not be initialized

也是i调用此函数时传入的变量。

0 投票
1 回答
38 浏览

c - 为什么第一个版本将换行符打印为 129 而第二个版本就可以了?

当我运行第一个程序时,nl(换行符)设置为 7ff,并打印出 129。

但是当我运行第二个程序时,一切正常......我想。

第二个节目

顺便说一句,这是The C Programming Language Book中的练习 1-8

0 投票
1 回答
140 浏览

c++ - 使用 constexpr 过度渴望 C++ 联合零初始化

下面是一个带标签的联合模板“Storage”的简化示例,它可以假设两种类型 L 和 R 包含在一个联合中,加上一个 bool 指示它们中的哪一个被存储。实例化使用两种不同大小的类型,较小的类型实际上是空的。

  • 构造函数用 Empty 初始化 R 成员,并且只为该成员调用联合的构造函数
  • 联合永远不会默认初始化为一个整体
  • 所有构造函数都是 constexpr

因此,函数“createStorage2”应该只填充 bool 标记,而不要理会联合。所以我期望一个带有默认优化“-O”的编译结果:

GCC 和 ICC 都生成类似的东西

将整个 32 字节结构归零,而 clang 生成预期的代码。您可以使用https://godbolt.org/z/VsDQUu重现此内容。只有当您从“createStorage”静态函数中删除 constexpr 时,GCC 才会恢复到所需的 bool 标记初始化,而 ICC 保持不变并仍填充所有 32 个字节。

这样做可能不违反标准,因为“未定义”的未使用位允许任何事情,包括设置为零和消耗不必要的 CPU 周期。但是很烦人,如果您首先出于效率原因引入了工会,并且您的工会成员的规模差异很大。

这里发生了什么?如果从构造函数和静态函数中删除 constexpr 不是一种选择,是否有任何方法可以解决此问题?

附注:即使所有 constexpr 都被删除,ICC 似乎也会执行一些额外的操作,如https://godbolt.org/z/FnjoPC

这些 movups 指令的目的是什么?

0 投票
1 回答
80 浏览

c++ - 我的基本零初始化代码有问题吗?

所以我希望代码运行一个程序:

  1. 你好!
  2. 我拉莫凯
  3. 我今年 19 岁
  4. 你是谁?
  5. [用户输入任何内容]
  6. 你是[用户输入]?

但相反,我得到的是:

  1. 你好!
  2. 我拉莫凯
  3. 我今年 19 岁
  4. 你是谁?
  5. [用户输入任何内容]
  6. 你是0?

编辑:在此处输入图像描述

0 投票
3 回答
1104 浏览

c++ - 为什么不将 C++ 结构初始化为 `= {0}` 将其所有成员设置为 0?

在进行了大量测试并编写了关于如何在 C++ 中将结构初始化为零的答案之后(注意:对它的否决是我完全重写它之前),我不明白为什么= {0}不设置所有成员结构为零!

如果你这样做:

...输出是:

...虽然我希望输出是这样的:

...这意味着只有 FIRST 成员设置为零,其余的都设置为默认值。

我一直认为以这三种方式中的任何一种初始化结构都会对其进行零初始化,但显然我错了!

  1. data_t d{}
  2. data_t d = {}
  3. data_t d = {0}

因此,我从这个答案中得到的关键结论是:

这里最大的收获是这些 NONE: data_t d{},data_t d = {}data_t d = {0}, 实际上将结构的所有成员设置为零!

  1. data_t d{}将所有值设置为结构中定义的默认值。
  2. data_t d = {}还将所有值设置为其默认值。
  3. 并且data_t d = {0}仅将 FIRST 值设置为零,并将所有其他值设置为其默认值。

那么,为什么不初始化 C++ 结构以= {0}将其所有成员设置为 0?

请注意,我上面的关键要点实际上与我多年来一直使用的这个看起来相当官方的文档相矛盾(https://en.cppreference.com/w/cpp/language/zero_initialization),它说T t = {} ;并且T {} ;都是零初始化器,事实上,根据我上面的测试和外卖,它们不是。

参考:

  1. 如何在 C++ 中将结构初始化为 0
  2. 更新:我刚刚也指向了这个引用:初始化对象时 {0} 是什么意思?
0 投票
0 回答
291 浏览

c++ - C ++中的C结构零初始化空括号?

如果使用 C++17 我做一个

变量mytm(并且为了安全起见,也是i)会被零初始化吗?

我通过这些页面循环发送:

我能找到的最接近的是零初始化

...,包括未提供初始化器的聚合元素的值初始化

另一种选择(我感觉不错)是默认初始化,这意味着不初始化。但我也发现这个,值初始化,意思是零。使困惑...

(我注意到,通过C 结构初始化,初始化程序不能为空。所以“像 C 中一样”的参数在这里不成立。)

0 投票
2 回答
103 浏览

assembly - 为什么某些 Windows 引导加载程序使用 `sub` 而不是 `xor` 编码零寄存器?

鉴于https://stackoverflow.com/a/33668295中详述的考虑因素,这似乎xor reg, reg是将寄存器归零的最佳方法。但是当我检查真实世界的汇编代码(例如 Windows 引导加载程序代码、IIRC)时,我看到xor reg, regsub reg, reg使用了这两个代码。

为什么sub完全用于此目的?sub在某些特殊情况下是否有任何理由偏爱?例如,它设置的标志与xor?

0 投票
1 回答
73 浏览

c++ - 直接重置结构的内容

我已经实现了一个函数,它重置指针指向的结构的内容:

Struct当变大(超过 10K)时我会遇到性能问题,因为Struct在堆栈中创建然后分配给*s. 我想知道我是否可以改进它:

  1. 是否可以在没有临时对象的情况下直接初始化? *sStruct{}
  2. Struct如果它很大,我应该评估它的大小并在堆中构建它吗?

先感谢您

0 投票
2 回答
144 浏览

c++ - 安全地初始化一个 std::array of bools

给定这个数组声明和初始化:

我可以假设数组中的所有元素都将始终初始化为 false,还是明确地这样做更好?

0 投票
1 回答
62 浏览

linux-kernel - 匿名按需填零映射页面的 PTE 地址字段是什么?

当程序调用mmap分配一个匿名页(也称为零需求页)时,对应的页表项 (PTE) 的地址字段中会出现什么?我假设内核不会物理内存中创建一个零初始化页面(并将该物理页面的页码输入到 PTE 中),直到请求进程实际接触到该页面 - 因此术语demand-zero。由于它不是磁盘地址,也不是 0(用于未分配的页面),所以那里会出现什么值?作为一个不同但相关的问题,内核如何“知道”该页面将作为需求零页面处理,即故障处理程序应该找到一个物理页面并将其初始化为 0 而不是从磁盘?