Это вопрос о взаимодействии памяти стека и памяти кучи и частном случае перехода от стека к куче через классы std::array
и std::vector
.
В принципе std::array<T>
можно рассматривать как указатель на первые элементы, а также некоторую информацию о времени компиляции о размере массива. Возможно ли иметь конструктор std::vector<T>
, который учитывает этот факт и пытается переместить содержимое array
в vector
, просто скопировав указатель.
Пример использования: у него есть функция, которая возвращает std::array<double, >
std::array<double, 20> fun(){...};
но позже решается назначить его std::vector
без необходимости копирования поэлементно.
std::vector<double> v = fun(); // not working code
Прямо сейчас нужно сделать
std::array<double, 20> tmp = fun();
std::vector<double> v(tmp.begin(), tmp.end());
Что на самом деле выполняет некоторую избыточную работу, в которой не было бы необходимости, если бы это было возможно std::vector<double> v(std::move(tmp)); \\ not working code
.
Схема памяти std::vector
и std::array
одинакова, так что это не препятствие.
Я понимаю, что основным препятствием может быть то, что std::array
элементов находятся в стеке, а std::vector
элементов находятся в куче. Понятно, что даже если написать конструктор перемещения для std::vector
, все равно память из стека будет безвозвратно уничтожена.
Поэтому я предполагаю, что этот вопрос также можно прочитать как:
Есть ли способ переместить память из стека в кучу (что бы это ни значило) и можно ли это объединить с конструктором перемещения?
Или если std::vector
может иметь в принципе конструктор перемещения из std::array
?
MWE:
#include<array>
#include<vector>
std::array<double, 20> fun(){return {};} // don't change this function
int main(){
std::array<double, 20> arr = fun(); // ok
std::vector<double> v(arr.begin(), arr.end()); // ok, but copies and the allocation is duplicated
std::vector<double> v2 = fun(); // not working, but the idea is that the work is not duplicated
}
std::vector
будет вести себя как обычно и перераспределит (зарезервирует) больше памяти (возможно, где-то еще в памяти). Оптимизация будет потеряна, но вопрос не в этом. - person alfC   schedule 01.12.2015vector
классов, использующих оптимизацию малого вектора. boost.org/doc/ libs/1_60_0/doc/html/container/ . AFAIK, который по-прежнему исключаетstd::vector
, который не использует эту оптимизацию (ноstd::basic_string
использует). Возможно также некая специализацияstd::vector
с особым (фальшивым) аллокатором, как в одном из комментариев ниже. - person alfC   schedule 14.01.2016