В некоторых случаях моей программе C++ 14 требуется «блок» около 100 миллионов complex<float>
, для чего требуется около 1 ГБ ОЗУ. Мы можем с уверенностью предположить, что необходимая память будет доступна.выделяют, но не строят большой массив объектов C++.
Однако выделение нового std::vector
происходит очень медленно, потому что сложный конструктор называется 100 миллионов раз. На моей машине для инициализации массива требуется код в течение полной секунды.
Для сравнения, вызов calloc()
, который инициализирует выделенную память до нуля, в основном с таким же эффектом, будет работать в очень маленьком количестве миллисекунд.
Оказывается, нам даже не нужна эта инициализация, потому что комплекс в большом массиве будет заселен вскоре позже из внешнего источника. Поэтому я смотрю на то, чтобы отложить построение объектов в этом «блоке» до более позднего времени, а затем построить их непосредственно из внешнего источника данных.
Итак, мой вопрос в том, существует ли безопасный идиоматический и эффективный способ C++, возможно, используя семантику перемещения C++ на этом пути? Если нет, и мы решаем просто блок памяти, можем ли мы тогда reinterpret_cast
блок памяти на простой старый массив C complex<float>
?
Благодарим Вас за помощь
Jean-Denis Muys
Используйте 'std :: vector <>', но используйте функцию 'reserve()' member, а не 'resize()' или размерный конструктор. – ildjarn
Действительно ли это так медленно, даже когда вы скомпилируете его с оптимизацией? Я не могу в это поверить. –
Почему вы хотите использовать вектор в этом случае? Вы не можете прикреплять/отсоединять память к вектору, но вы можете использовать все std-алгоритмы, используя указатели вместо итераторов. – 0kcats