为什么 std::complex<> 在默认构造时将其值初始化为 0?

计算科学 C++
2021-12-18 16:43:25

这样做让我觉得浪费时间。考虑

std::complex<double> *a = new std::complex<double>[1<<28];

这可能是近乎瞬时的,并且只有在页面被使用后才会抓取页面,但事实并非如此。

看来我不是唯一一个对此感到困扰的人:

http://listengine.tuxfamily.org/lists.tuxfamily.org/eigen/2011/01/msg00124.html

GCC 的 libstdc++ (4.6.3) 甚至对这个事实幸灾乐祸:

  ///  Default constructor.  First parameter is x, second parameter is y.
  ///  Unspecified parameters default to 0.
  _GLIBCXX_CONSTEXPR complex(const _Tp& __r = _Tp(), const _Tp& __i = _Tp())
  : _M_real(__r), _M_imag(__i) { }

更糟糕的是,由于 C++ 标准没有指定默认构造函数,甚至可能需要这种行为。(这是真的?)

1个回答

我会说初始化为零遵循最不意外的原则。周围有未初始化的值是错误的处方,而且初始化肯定是一个比你稍后要用这些复数做的几乎任何其他事情都要便宜得多的过程。例如,1<<28 个复数值的分配和初始化为零可以用一个 malloc 和一个 memset 完成。