Jua*_*njo 7 c++ default-constructor c++11
在分析我的程序时,我意识到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() );
Run Code Online (Sandbox Code Playgroud)
但规范然后介绍了double的特殊情况
complex(double re = 0.0, double im = 0.0);
Run Code Online (Sandbox Code Playgroud)
正是这种特殊情况引入了所有开销,因为它绕过了'double'的实际默认构造函数,它什么都不做(与int,long,float等相同).
我想知道为什么g ++很难用零来初始化std :: complex
因为标准说它必须这样做,所以默认构造函数声明为:
constexpr complex(double re = 0.0, double im = 0.0);
Run Code Online (Sandbox Code Playgroud)
所以它将两个成员都设置为零.
这是正常的标准库安全初始化类型,而不是让他们为你获得未初始化的内置类型,如double和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;
};
Run Code Online (Sandbox Code Playgroud)
现在如果你使用std::complex<D>默认构造函数什么都不做.添加explicit到转换构造函数和/或转换运算符以满足您的口味.