В профилировании моей программы я понял, что 10% кода потрачено на глупый конструктор std::complex<double>()
, используя new std::complex<double>[size_of_array]
.Неинициализированный std :: complex constructor при использовании 'new'
Я искал в Интернете, и конструктор по умолчанию для 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 и т. д.).
Прочитано, например. [эта ссылка на конструктор std :: complex] (http://en.cppreference.com/w/cpp/numeric/complex/complex). Значения указываются так, чтобы всегда инициализироваться с использованием аргументов по умолчанию. –
@ Juanjo, следующий за советом Гоза, является гораздо более простой/лучшей альтернативой, но если вам абсолютно необходимо это делать с массивами, то вам, возможно, придется сделать это с помощью _placement 'new'_; не очень мудрый вариант. – legends2k
@JoachimPileborg thx для указателя, я понял, что только прочитал первый комплекс линий (const T & re = T(), const T & im = T()); и предположил, что double() поэтому неинициализирован. Я чувствую, что особые случаи ниже являются непоследовательными, но им придется жить с этим. Жаль, потому что эти накладные расходы пронизывают все мои библиотеки, включая определения переменных и т. П. Вам придется работать через них один за другим: -/ – Juanjo