【问题标题】:Does resize guarantee an std::valarray to be zeroed?调整大小是否保证将 std::valarray 归零?
【发布时间】:2016-10-17 23:24:21
【问题描述】:

x.resize(1024) 是否保证 valarray x 将被归零?
std::valarray<float> z(1024); 是否保证也会用零填充?

这适用于 Mac、Windows、Linux 吗? 即使对于 C++03(我没有使用 C++11)也是如此吗?

(我读过的所有文档似乎都证明了这一点,但是 1)如果省略了第二个参数,则文档 don't explicitely state what happens 2)我正在尝试调试一个难以重现的奇异错误,其中一些数组默认不归零,我现在无法发布显示此错误的最小代码,但我会尝试在可用时添加一个)


示例代码:

#include <valarray>
#include <complex>

int main()
{
  std::valarray<double> x;
  std::valarray<std::complex<double>> y;
  std::valarray<float> z(1024);  
  x.resize(1024);
  y.resize(1024);
  // are all x, y, z  filled with zeros?
}

【问题讨论】:

  • "第一个成员函数使用它们的默认构造函数初始化元素。"对我来说似乎很清楚。虽然,这实际上不是很精确,而且 MSDN 也不权威,但所提出的一般观点是正确的。这是一个更好的参考:en.cppreference.com/w/cpp/numeric/valarray/resize。 (虽然仍然不权威;只有标准是。)
  • 来自您链接的文档:“第一个成员函数 [没有第二个参数] 使用其默认构造函数初始化元素。”
  • @GManNickG:“...使用默认构造函数初始化元素”当然在形式上是不正确的,尤其是在 OP 的情况下。 floatdouble 没有任何构造函数。即使我们纯粹假设允许floatdouble 中存在“默认构造函数”,谁说它设置为零?
  • @AnT:因此我说它的原因并不准确。 :)
  • 为什么投反对票?这个问题不相关吗?想要确定某件事(这可能听起来很简单)是真的吗?

标签: c++ arrays c++03 valarray


【解决方案1】:

valarray&lt;T&gt;::resize的标准声明是

void resize(size_t sz, T c = T());

其中c 是用于新元素的值(如果有)。如果某个实现决定将其实现为两个重载函数而不是一个带有默认参数(这是允许的)的函数,它必须保留标准行为。

这意味着是的,如果 resize 创建新元素,它们必须进行值初始化(在您的情况下为零初始化)。

【讨论】:

  • 那么这是否意味着我们确信在所有实现(至少是 Windows 和 Mac OS)中它始终为零?
  • @Basj:是的,对于标量类型,它将一直为零,除非您的实现被破坏。
  • They have to be value-initialized... :我自己?还是您的意思是它们自动初始化为0?
  • @Basj:值初始化是 C++ 术语中的标准术语。它是由() 初始化程序触发的特定类型的初始化。它的作用取决于被初始化对象的类型。对于标量类型,它归结为零初始化。对于类类型,它可以是完全不同的东西。
  • 感谢您的回答。最后一件事:我在您回答时添加了这个问题:std::valarray&lt;float&gt; z(1024); 呢?这条线会自动归零吗?
猜你喜欢
  • 2012-07-10
  • 2021-09-11
  • 2018-12-19
  • 2016-03-27
  • 2011-01-15
  • 1970-01-01
  • 1970-01-01
  • 2010-11-12
  • 1970-01-01
相关资源
最近更新 更多