在分析我的程序时,我意识到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等相同).
我知道引用可以延长 C++中返回值的生命周期.有了这个哲学,我尝试了以下内容:我有三个分支,'张量','视图'和'mutable_view'.张量上的Operator()返回"const视图"对象.此视图具有私有拷贝构造函数,因此无法复制视图,因为它保留有关可能无法在当前语句之外生存的张量的信息.
#include <iostream>
#include <algorithm>
struct tensor {
int data[10];
class view {
const int *const data;
view();
view(const view &);
public:
view(const int *new_data) : data(new_data) {}
int operator*() const { return *data; }
};
class mutable_view {
int *const data;
mutable_view();
mutable_view(const mutable_view &);
public:
mutable_view(int *new_data) : data(new_data) {}
void operator=(const view &v) {
*data = *v;
}
};
tensor(int n) {
std::fill(data, data+10, n);
}
const view operator()(int ndx) const {
return …Run Code Online (Sandbox Code Playgroud)