Re[2]: C++17: new с выравниванием - как удалять по феншую?
От: uzhas Ниоткуда  
Дата: 28.12.18 13:35
Оценка:
Здравствуйте, watchmaker, Вы писали:

W>Собственно, если хочется дальше вручную тут этим управлять, то нужно также самому вручную доставить до delete и аргумент align_val_t, который был передан в new при выделении.


покажи плиз как доставить, напиши конкретный код освобождения:
auto p = new(std::align_val_t(64)) std::string();

// что-то делаем с p

// delete p;  <--- напиши свой вариант



если было введено плюсовое выделение (привет типам, конструкторам и деструкторам), то обязаны были задизайнить и парную функцию (оператор?)
вариант с вызовом "operator delete....." я видел в этой ветке, но это что-то непарное, ибо не плюсовое (освобождает только память?)
"выравнивание — свойство типа" — это в данном контексте нерелевантное заявление. новый оператор new тому подтверждение. он явно принимает и тип и правила выравнивания
Re[3]: C++17: new с выравниванием - как удалять по феншую?
От: Vamp Россия  
Дата: 28.12.18 14:21
Оценка: 26 (2) +1
U>если было введено плюсовое выделение (привет типам, конструкторам и деструкторам), то обязаны были задизайнить и парную функцию (оператор?)
U>вариант с вызовом "operator delete....." я видел в этой ветке, но это что-то непарное, ибо не плюсовое (освобождает только память?)
Ты не прав. Никакого специального синтаксиса для new expression связанного с выравниванием не вводили. В данном случае то, что ты можешь использовать new expression с alignment — сайд-эффект функционала передачи параметров из new expression в operator new (которое раньше использовалось для placement new и, иногда, специальной тагированной аллокации)

U>"выравнивание — свойство типа" — это в данном контексте нерелевантное заявление. новый оператор new тому подтверждение. он явно принимает и тип и правила выравнивания

Нет. Следует различать new expression и operator new. Для new expression никаких специальных параметров выравнивания не вводили. Его просто обязали звать выровненный operator new если выравнивание типа превышает стандартное, и, как сайд-эффект, через уже существующий синтаксис можно звать выровненный operator new. А operator new — это сырой аллокатор, он ничего о типе не знает.
Да здравствует мыло душистое и веревка пушистая.
Re[4]: C++17: new с выравниванием - как удалять по феншую?
От: uzhas Ниоткуда  
Дата: 28.12.18 14:59
Оценка:
Здравствуйте, Vamp, Вы писали:


V>Ты не прав. Никакого специального синтаксиса для new expression связанного с выравниванием не вводили.

эээ, я-то тут подумал что-то совсем новенькое


V>Для new expression никаких специальных параметров выравнивания не вводили. Его просто обязали звать выровненный operator new если выравнивание типа превышает стандартное, и, как сайд-эффект, через уже существующий синтаксис можно звать выровненный operator new. А operator new — это сырой аллокатор, он ничего о типе не знает.


ну то есть был некий старый кривой механизм и через него завели в стандарте дорожку для создания выровненных объектов?
а кривизну решили не выправлять?
Re[5]: C++17: new с выравниванием - как удалять по феншую?
От: Vamp Россия  
Дата: 28.12.18 15:19
Оценка:
U>ну то есть был некий старый кривой механизм и через него завели в стандарте дорожку для создания выровненных объектов?
U>а кривизну решили не выправлять?
Если кривым механизмом ты называешь весь этот конандрум с new expression и перегружаемым оператором new, который существовал в С++ со времен CFront, то ты прав.

Но отношения к выравниванию это не имеет никакого.
Да здравствует мыло душистое и веревка пушистая.
Re[6]: C++17: new с выравниванием - как удалять по феншую?
От: uzhas Ниоткуда  
Дата: 29.12.18 09:28
Оценка:
Здравствуйте, Vamp, Вы писали:

V>Если кривым механизмом ты называешь весь этот конандрум с new expression и перегружаемым оператором new, который существовал в С++ со времен CFront, то ты прав.


тем не менее исходный вопрос от ТС актуален, пусть даже с неудобствами, но код ведь можно написать. а то развели демагогию
повторю: покажите конкретный (и корректный) код освобождения объекта
Re[7]: C++17: new с выравниванием - как удалять по феншую?
От: night beast СССР  
Дата: 29.12.18 10:02
Оценка: 10 (1)
Здравствуйте, uzhas, Вы писали:

V>>Если кривым механизмом ты называешь весь этот конандрум с new expression и перегружаемым оператором new, который существовал в С++ со времен CFront, то ты прав.


U>тем не менее исходный вопрос от ТС актуален, пусть даже с неудобствами, но код ведь можно написать. а то развели демагогию

U>повторю: покажите конкретный (и корректный) код освобождения объекта

стандартным способом освобождения при использовании перегруженных операторов new и delete:
явный вызов деструктора + явный вызов перегруженного оператора удаления.
как-то так:
template<typename T, typename... Args>
void release(T *ptr, Args... args)
{
   ptr->~T();
   operator delete(ptr, std::forward<Args>(args)...);
}
Отредактировано 29.12.2018 11:23 night beast . Предыдущая версия .
Re[8]: C++17: new с выравниванием - как удалять по феншую?
От: uzhas Ниоткуда  
Дата: 29.12.18 12:18
Оценка:
Здравствуйте, night beast, Вы писали:

NB>как-то так:

template<typename T, typename... Args>
void release(T *ptr, Args... args)
{
  ptr->~T();
  operator delete(ptr, std::forward<Args>(args)...);
}


мне нравится такой вариант
не хватает проверки на nullptr и амперсандиков досыпать? =)
Re[9]: C++17: new с выравниванием - как удалять по феншую?
От: night beast СССР  
Дата: 29.12.18 17:51
Оценка:
Здравствуйте, uzhas, Вы писали:

U>мне нравится такой вариант

U>не хватает проверки на nullptr и амперсандиков досыпать? =)

ну это набросок.
на самом деле, не знаю какая практическая польза от этого.
в основном с аллокаторами работа происходит.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.