Сообщение Re: union требует конструктор, зачем так сделано? от 06.06.2023 10:15
Изменено 06.06.2023 10:34 rg45
Re: union требует конструктор, зачем так сделано?
Здравствуйте, Sm0ke, Вы писали:
S>Собственно хочу создать через new массив элементов T без вызова их конструкторов, чтобы потом по требованию делать std::construct_at() только для отдельных элементов .
S>Если поместить этот T в union для отложенной инициализации, и у T есть конструктор по умолчанию не дефоолтный, то стандарт требует добавление в union тоже конструктора по умолчанию, даже если тот ничего не делает... Зачем так сделано?
S>Тобишь создам через new массив 50 элементов union и для каждого будет вызван конструктор в процессе.. Это же замедление!
S>Подскажите как лучше. Использовать aligned_storage нет желания, и reinterprete_cast тоже.
Вот прямо так, как ты описал, не получится — инициализация массива предполагает инициализацию каждого его элемента. Но ты можешь получить очень близкую функциональность при помощи std::vector и двух его функций-членов — reserve и emplace_back. Эскизно так:
S>Собственно хочу создать через new массив элементов T без вызова их конструкторов, чтобы потом по требованию делать std::construct_at() только для отдельных элементов .
S>Если поместить этот T в union для отложенной инициализации, и у T есть конструктор по умолчанию не дефоолтный, то стандарт требует добавление в union тоже конструктора по умолчанию, даже если тот ничего не делает... Зачем так сделано?
S>Тобишь создам через new массив 50 элементов union и для каждого будет вызван конструктор в процессе.. Это же замедление!
S>Подскажите как лучше. Использовать aligned_storage нет желания, и reinterprete_cast тоже.
Вот прямо так, как ты описал, не получится — инициализация массива предполагает инициализацию каждого его элемента. Но ты можешь получить очень близкую функциональность при помощи std::vector и двух его функций-членов — reserve и emplace_back. Эскизно так:
std::vector<MyItem> v;
v.reserve(50); // резервируем память под 50 элементов, без создания самих самих элементов.
assert(v.size() == 0);
v.emplace_back(arg1, arg2, arg3); // конструируем элементы прямо по месту выделенной памяти, без промежуточных копирований и перемещений
v.emplace_back(arg1, arg2, arg3); // фактически внутри вектора используется placement new, только скрыто от программиста
v.emplace_back(arg1, arg2, arg3);
assert(v.size() == 3);Re: union требует конструктор, зачем так сделано?
Здравствуйте, Sm0ke, Вы писали:
S>Собственно хочу создать через new массив элементов T без вызова их конструкторов, чтобы потом по требованию делать std::construct_at() только для отдельных элементов .
S>Подскажите как лучше. Использовать aligned_storage нет желания, и reinterprete_cast тоже.
Вот прямо так, как ты описал, не получится — инициализация массива предполагает инициализацию каждого его элемента. Но ты можешь получить очень близкую функциональность при помощи std::vector и двух его функций-членов — reserve и emplace_back. Эскизно так:
S>Собственно хочу создать через new массив элементов T без вызова их конструкторов, чтобы потом по требованию делать std::construct_at() только для отдельных элементов .
S>Подскажите как лучше. Использовать aligned_storage нет желания, и reinterprete_cast тоже.
Вот прямо так, как ты описал, не получится — инициализация массива предполагает инициализацию каждого его элемента. Но ты можешь получить очень близкую функциональность при помощи std::vector и двух его функций-членов — reserve и emplace_back. Эскизно так:
std::vector<MyItem> v;
v.reserve(50); // резервируем память под 50 элементов, без создания самих самих элементов.
assert(v.size() == 0);
v.emplace_back(arg1, arg2, arg3); // конструируем элементы прямо по месту выделенной памяти, без промежуточных копирований и перемещений
v.emplace_back(arg1, arg2, arg3); // фактически внутри вектора используется placement new, только скрыто от программиста
v.emplace_back(arg1, arg2, arg3);
assert(v.size() == 3);