gpt4 book ai didi

c++ - 使用 'new' 时未初始化的 std::complex 构造函数

转载 作者:可可西里 更新时间:2023-11-01 18:28:07 25 4
gpt4 key购买 nike

在分析我的程序时,我意识到 10% 的代码花在了一个愚蠢的 std::complex<double>() 上。构造函数,使用 new std::complex<double>[size_of_array] .

我在网上搜索了 std::complex 的默认构造函数似乎将值 double() 作为实部和虚部。由于 C++ 不初始化 double ,我想知道为什么 g++ 费心初始化 std::complex零,以及我是否可以通过某种方式在整个程序中解决这个问题 (*)

(*) 现在我必须对创建复数数组的函数进行特殊处理,以分配未初始化的 double 组并将它们重铸为复数。

编辑:如下所示,这是我的疏忽。默认构造函数的实部和虚部构造函数为空 (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 等相同)。

最佳答案

I wonder why g++ bothers to initialize std::complex with zeros

因为标准规定必须这样做,所以默认构造函数声明为:

constexpr complex(double re = 0.0, double im = 0.0);

因此它将两个成员都设置为零。

标准库安全地初始化类型是正常的,而不是像 double 这样的内置类型那样让它们未初始化。和 int* ,例如 std::vector<double>如果您调整它的大小以便添加新元素,它也会对其元素进行零初始化。您可以控制此 vector通过不向 vector 添加元素直到您知道您希望他们拥有什么值(value)观。

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转换构造函数和/或转换运算符以满足您的口味。

关于c++ - 使用 'new' 时未初始化的 std::complex 构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27290766/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com