在分析我的程序时,我意识到 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 http://en.cppreference.com/w/cpp/numeric/complex/complex)
complex( const T& re = T(), const T& im = T() );
但规范随后引入了 double 的特殊情况
complex(double re = 0.0, double im = 0.0);
正是这种特殊情况引入了所有开销,因为它绕过了“double”的实际默认构造函数,该构造函数不执行任何操作(与 int、long、float 等相同)。
我想知道为什么 g++ 费心用零初始化 std::complex
因为标准规定必须这样做,所以默认构造函数声明为:
constexpr complex(double re = 0.0, double im = 0.0);
所以它将两个成员都设置为零。
标准库安全地初始化类型是正常的,而不是像使用内置类型(例如double
and int*
, 例如std::vector<double>
如果您调整其大小以便添加新元素,也会对其元素进行零初始化。你可以控制这个vector
通过不添加元素vector
直到您知道您希望他们拥有什么价值观。
一种可能的解决方法complex
是使用不进行初始化的类型:
struct D
{
D() noexcept { }; // does not initialize val!
D(double d) noexcept : val(d) { }
operator double() const noexcept { return val; }
D& operator=(double d) noexcept { val = d; return *this; }
double val;
};
现在如果你使用std::complex<D>
默认构造函数不执行任何操作。添加explicit
转换构造函数和/或转换运算符以满足您的口味。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)