【发布时间】:2015-02-02 03:21:54
【问题描述】:
在分析我的程序时,我意识到 10% 的代码用在了一个愚蠢的 std::complex<double>() 构造函数中,使用了 new std::complex<double>[size_of_array]。
我在网上搜索过,std::complex 的默认构造函数似乎将值 double() 作为实部和虚部。由于 C++ 不初始化双数,我想知道为什么 g++ 会费心用零初始化 std::complex,以及我是否可以通过整个程序以某种方式解决这个问题 (*)
(*) 现在我必须对创建复数数组的函数进行特殊处理,以分配未初始化的双精度数组并将它们重铸为复数。
编辑:如下所述,这是我的疏忽。默认构造函数有实部和虚部的空构造函数 (http://en.cppreference.com/w/cpp/numeric/complex/complex)
complex( const T& re = T(), const T& im = T() );
但规范随后介绍了双精度的特殊情况
complex(double re = 0.0, double im = 0.0);
正是这种特殊情况引入了所有开销,因为它绕过了“double”的实际默认构造函数,它什么都不做(与 int、long、float 等相同)。
【问题讨论】:
-
阅读例如this
std::complexconstructor reference。这些值被指定为始终使用默认参数进行初始化。 -
@Juanjo 遵循 Goz 的建议是一个更简单/更好的选择,但如果您绝对必须使用数组,那么您可能必须使用 placement
new;这不是一个明智的选择。 -
@JoachimPileborg thx 对于指针,我意识到我只阅读了第一行 complex( const T& re = T(), const T& im = T() );并假设 double() 因此未初始化。我觉得下面的特殊情况有点不一致,但必须忍受。很遗憾,因为这种开销渗透到我所有的库中,包括变量定义等。将不得不一一解决它们:-/
-
double()未未初始化。 -
我错过了什么吗?专门化的存在只是为了允许按值传递双精度 - 它与非专门化构造函数具有相同的语义 -
double()等于0.0。
标签: c++ c++11 default-constructor