Переносимые _Construct_in_place и _Destroy_in_place
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 07.03.17 18:43
Оценка:
Поставил 2017 студию.

В хедере с настройкой под конкретную версию STL пришлось заменить

#define  __STL_CONSTRUCTOR_FUNC             std::_Construct
#define  __STL_DESTROYER_FUNC               std::_Destroy

на
#define  __STL_CONSTRUCTOR_FUNC(ptr,a)      std::_Construct_in_place(*(ptr),a)
#define  __STL_DESTROYER_FUNC(ptr)          std::_Destroy_in_place(*(ptr))


Это функции для "in-place" создания и разрушения объектов.

Возник вопрос — когда в STL появятся стандартные вещи для этих задач? Или они там уже давно есть?
PS. Это, практически, единственное что пришлось откорректировать для сборки достаточно большого проекта в новой студии
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re: Переносимые _Construct_in_place и _Destroy_in_place
От: _NN_ www.nemerleweb.com
Дата: 07.03.17 20:11
Оценка:
Здравствуйте, Коваленко Дмитрий, Вы писали:

КД>Возник вопрос — когда в STL появятся стандартные вещи для этих задач? Или они там уже давно есть?

КД>PS. Это, практически, единственное что пришлось откорректировать для сборки достаточно большого проекта в новой студии

А реализация функций какая ?

Возможно

_Construct: placement new

_Destruct: просто вызов деструктора скажем:
template<typename T> void f(T& t) { t->~T(); }
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: Переносимые _Construct_in_place и _Destroy_in_place
От: LaptevVV Россия  
Дата: 08.03.17 08:26
Оценка:
КД>Возник вопрос — когда в STL появятся стандартные вещи для этих задач? Или они там уже давно есть?
Дык стандартный аллокатор жеж!
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re: Переносимые _Construct_in_place и _Destroy_in_place
От: Videoman Россия https://hts.tv/
Дата: 08.03.17 08:57
Оценка: 6 (1) +3
Здравствуйте, Коваленко Дмитрий, Вы писали:

КД>Возник вопрос — когда в STL появятся стандартные вещи для этих задач? Или они там уже давно есть?


Так зачем тут STL, достаточно С++:
new (pointer) Type(....); // Создание по месту
pointer->~Type(); // Разрушение по месту

или я не понял вопроса.
Re[2]: Переносимые _Construct_in_place и _Destroy_in_place
От: Alexander G Украина  
Дата: 08.03.17 09:40
Оценка:
Здравствуйте, LaptevVV, Вы писали:

КД>>Возник вопрос — когда в STL появятся стандартные вещи для этих задач? Или они там уже давно есть?

LVV>Дык стандартный аллокатор жеж!

std::allocator::construct / std::allocator::destroy ?

deprecated уже ж!

( просто используйте placement new / [pseudo] destructor call )
Русский военный корабль идёт ко дну!
Re[2]: Переносимые _Construct_in_place и _Destroy_in_place
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 08.03.17 11:45
Оценка:
Здравствуйте, Videoman, Вы писали:

V>Здравствуйте, Коваленко Дмитрий, Вы писали:


КД>>Возник вопрос — когда в STL появятся стандартные вещи для этих задач? Или они там уже давно есть?


V>Так зачем тут STL, достаточно С++:

V>
V>new (pointer) Type(....); // Создание по месту
V>pointer->~Type(); // Разрушение по месту
V>

V>или я не понял вопроса.

Причина возникновения этих макросов уходит в эпоху динозавров древних BCB, которые (кажется) не умели вызывать деструкторов для встроенных типов и указателей на указатели.

Я посмотрел что ихняя STL вызывает для construct/destroy и настроил свои контейнеры на эти утилиты.

Кроме того, я определял свои destroy-функции с такими же именами — STL вызывала их не сыпала варнинги.

Это было лет так 16 назад. С BCB я попрощался 7 лет назад.

Наверное надо уже определить свои утилиты и не компостировать мозги
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re[3]: Переносимые _Construct_in_place и _Destroy_in_place
От: LaptevVV Россия  
Дата: 08.03.17 12:12
Оценка:
LVV>>Дык стандартный аллокатор жеж!
AG>std::allocator::construct / std::allocator::destroy ?
AG>deprecated уже ж!
Когда успели-то?
А то я в 11 стандарте пишу — вроде у Джоссатиса не указано, что депрекэйтед.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[4]: Переносимые _Construct_in_place и _Destroy_in_place
От: Alexander G Украина  
Дата: 08.03.17 12:48
Оценка:
Здравствуйте, LaptevVV, Вы писали:

LVV>Когда успели-то?

LVV>А то я в 11 стандарте пишу — вроде у Джоссатиса не указано, что депрекэйтед.

C++17

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0174r0.html#4.1

Для кастомных аллокаторов (не std::allocator) construct и destruct опциональны ещё с С++11.
В стандартном allocator_traits при отсутствии construct и destruct у аллокатрора предусмотрен прямой вызов соответственно placement new и (pseudo) destructor
Русский военный корабль идёт ко дну!
Отредактировано 08.03.2017 12:49 Alexander G . Предыдущая версия .
Re[5]: Переносимые _Construct_in_place и _Destroy_in_place
От: LaptevVV Россия  
Дата: 08.03.17 13:05
Оценка:
AG>C++17
AG>http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0174r0.html#4.1
Ну, до этого еще дожить надо...
AG>Для кастомных аллокаторов (не std::allocator) construct и destruct опциональны ещё с С++11.
AG>В стандартном allocator_traits при отсутствии construct и destruct у аллокатрора предусмотрен прямой вызов соответственно placement new и (pseudo) destructor
Спасибо. Посмотрю непосредственно в стандарте.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[2]: Переносимые _Construct_in_place и _Destroy_in_place
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 08.03.17 15:06
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>Здравствуйте, Коваленко Дмитрий, Вы писали:


КД>>Возник вопрос — когда в STL появятся стандартные вещи для этих задач? Или они там уже давно есть?

КД>>PS. Это, практически, единственное что пришлось откорректировать для сборки достаточно большого проекта в новой студии

_NN>А реализация функций какая ?


  VS2015 Upd3
        // TEMPLATE FUNCTION _Construct
template<class _Ty1,
    class _Ty2> inline
    void _Construct(_Ty1 *_Ptr, _Ty2&& _Val)
    {    // construct object at _Ptr with value _Val
    void *_Vptr = _Ptr;
    ::new (_Vptr) _Ty1(_STD forward<_Ty2>(_Val));
    }

template<class _Ty1> inline
    void _Construct(_Ty1 *_Ptr)
    {    // construct object at _Ptr with default value
    void *_Vptr = _Ptr;

    ::new (_Vptr) _Ty1();
    }

        // TEMPLATE FUNCTION _Destroy
template<class _Ptrty> inline
    void _Destroy(_Ptrty _Ptr)
    {    // destroy object at _Ptr
    typedef typename pointer_traits<_Ptrty>::element_type _Ty;
    _Ptr->~_Ty();
    }

  VS2017
        // TEMPLATE FUNCTION _Construct_in_place
template<class _Ty,
    class... _Types> inline
    void _Construct_in_place(_Ty& _Obj, _Types&&... _Args)
        _NOEXCEPT_OP((is_nothrow_constructible<_Ty, _Types...>::value))
    {    // invoke True Placement New to initialize the referenced object with _Args...
    ::new (const_cast<void *>(static_cast<const volatile void *>(_STD addressof(_Obj))))
        _Ty(_STD forward<_Types>(_Args)...);
    }
        // TEMPLATE FUNCTION _Destroy_in_place
template<class _Ty> inline
    void _Destroy_in_place(_Ty& _Obj) _NOEXCEPT
    {    // destroy the referenced object
    _Obj.~_Ty();
    }
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re: Переносимые _Construct_in_place и _Destroy_in_place
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 09.03.17 08:04
Оценка:
Здравствуйте, Коваленко Дмитрий, Вы писали:

КД>Поставил 2017 студию.


КД>В хедере с настройкой под конкретную версию STL пришлось заменить


#define  __STL_CONSTRUCTOR_FUNC             std::_Construct
#define  __STL_DESTROYER_FUNC               std::_Destroy


КД>на

  Первоначальный вариант
#define  __STL_CONSTRUCTOR_FUNC(ptr,a)      std::_Construct_in_place(*(ptr),a)
#define  __STL_DESTROYER_FUNC(ptr)          std::_Destroy_in_place(*(ptr))

Два дня думал, как правильно прикрутить _Construct_in_place, чтобы сохранить все его возможности — вызов без аргументов и более чем одним аргументом.
Открыл для себя макросы с переменным числом параметров

#define  __STL_CONSTRUCTOR_FUNC(ptr, ...)   std::_Construct_in_place(*(ptr),__VA_ARGS__)


Проверил на коде вида:
 int tmp=1;
 __STL_CONSTRUCTOR_FUNC((int*)&tmp);

Компилируется и работает.
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Отредактировано 09.03.2017 13:30 DDDX . Предыдущая версия .
Re[2]: Переносимые _Construct_in_place и _Destroy_in_place
От: _NN_ www.nemerleweb.com
Дата: 09.03.17 13:56
Оценка:
Здравствуйте, Коваленко Дмитрий, Вы писали:

КД>Два дня думал, как правильно прикрутить _Construct_in_place, чтобы сохранить все его возможности — вызов без аргументов и более чем одним аргументом.

КД>Открыл для себя макросы с переменным числом параметров
Форум читать надо чаще
https://rsdn.org/forum/cpp/4677547.flat#4677547
Автор: serenissimus
Дата: 27.03.12

https://rsdn.org/forum/cpp/1270781.flat#1270781
Автор: MaximE
Дата: 13.07.05


КД>
КД>#define  __STL_CONSTRUCTOR_FUNC(ptr, ...)   std::_Construct_in_place(*(ptr),__VA_ARGS__)
КД>


КД>Проверил на коде вида:

КД>
КД> int tmp=1;
КД> __STL_CONSTRUCTOR_FUNC((int*)&tmp);
КД>

КД>Компилируется и работает.
А почему тогда не шаблон с переменным количеством параметров ?
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[3]: Переносимые _Construct_in_place и _Destroy_in_place
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 09.03.17 14:50
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>Форум читать надо чаще




_NN>А почему тогда не шаблон с переменным количеством параметров ?


Я думал об этом... Но поскольку с макросами все получилось, решил повременить.
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re[3]: Переносимые _Construct_in_place и _Destroy_in_place
От: rus blood Россия  
Дата: 09.03.17 14:54
Оценка:
Здравствуйте, Коваленко Дмитрий, Вы писали:

КД>
  VS2017
КД>
КД>        // TEMPLATE FUNCTION _Construct_in_place
КД>template<class _Ty,
КД>    class... _Types> inline
КД>    void _Construct_in_place(_Ty& _Obj, _Types&&... _Args)
КД>        _NOEXCEPT_OP((is_nothrow_constructible<_Ty, _Types...>::value))
КД>    {    // invoke True Placement New to initialize the referenced object with _Args...
КД>    ::new (const_cast<void *>(static_cast<const volatile void *>(_STD addressof(_Obj))))
КД>        _Ty(_STD forward<_Types>(_Args)...);
КД>    }
КД>        // TEMPLATE FUNCTION _Destroy_in_place
КД>template<class _Ty> inline
КД>    void _Destroy_in_place(_Ty& _Obj) _NOEXCEPT
КД>    {    // destroy the referenced object
КД>    _Obj.~_Ty();
КД>    }
КД>



А почему ссылка?
Как можно ссылаться на объект, которые еще не построен?
Имею скафандр — готов путешествовать!
Re[4]: Переносимые _Construct_in_place и _Destroy_in_place
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 09.03.17 15:16
Оценка:
Здравствуйте, rus blood, Вы писали:

КД>>VS2017


RB>А почему ссылка?

RB>Как можно ссылаться на объект, которые еще не построен?

Я думаю, это типа такая защита от нулевого указателя.
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re[5]: Переносимые _Construct_in_place и _Destroy_in_place
От: rus blood Россия  
Дата: 11.03.17 16:36
Оценка: 1 (1)
Здравствуйте, Коваленко Дмитрий, Вы писали:

RB>>А почему ссылка?

RB>>Как можно ссылаться на объект, которые еще не построен?

КД>Я думаю, это типа такая защита от нулевого указателя.


Я это к тому, что код с указателем как в примере из 2015, генерирует проверку указателя на ноль.
Поскольку такая проверка в placement new часто не имеет смысла, я ее подавляю с помощью __assume.
Наверно, вариант с ссылкой не генерирует проверку на ноль.
Вопрос только, насколько "законно" использовать ссылку до конструирования объекта.
Имею скафандр — готов путешествовать!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.