Size: a a a

2020 November 28

p

paperbot_cpp in pro.cxx
magras
> We propose that at minimum the following operations be specified as implicitly creating objects:
> * Creation of an array of char, unsigned char, or std::byte implicitly creates objects within that array.

Таки должно работать с обычными массивами. Если что это из [P0593R6].
источник

m

magras in pro.cxx
Liber Azerate
Вообще, в C++20 добавился bit_cast, насчёт memcpy, как мне кажется, это было и до 20-го стандарта
Не думаю. С memcpy трюк заключался в том, чтобы скопировать данные в уже существующий объект нужного типа. По-моему на cppref в статье про bit_cast была реализация для старых стандартов использующая этот прием.
источник

LA

Liber Azerate in pro.cxx
magras
Не думаю. С memcpy трюк заключался в том, чтобы скопировать данные в уже существующий объект нужного типа. По-моему на cppref в статье про bit_cast была реализация для старых стандартов использующая этот прием.
Ну да, объект должен был уже существовать. Вероятно, в том примере в любом случае необходимо было решить проблему с lifetime, так или иначе
источник

АР

Андрей Руссков... in pro.cxx
magras
Окей, я сформулирую свою мысль по-другому. В этом примере нет UB:
char* buf = new char[sizeof(T)]; // assuming here that T has no overalignment
new(buf) T;
T* p = reinterpret_cast<T*>(buf); // я специально разделил placement new и каст
*p; // read or write T
кажется в с++20 это и поправили
источник

NI

Nikita Ivanov in pro.cxx
std::memory
источник

АР

Андрей Руссков... in pro.cxx
magras
Окей, я сформулирую свою мысль по-другому. В этом примере нет UB:
char* buf = new char[sizeof(T)]; // assuming here that T has no overalignment
new(buf) T;
T* p = reinterpret_cast<T*>(buf); // я специально разделил placement new и каст
*p; // read or write T
кстати можно же делать
void* ptr = operator new(16, std::align_val_t(16));
источник

m

magras in pro.cxx
Андрей Руссков
кстати можно же делать
void* ptr = operator new(16, std::align_val_t(16));
Мне лень было искать точный синтаксис, чтобы задать правильное выравнивание, поэтому я использовал то что new char[] имеет максимальное "обычное" выравнивание и добавил комментарий про overalignment. =)
источник

АР

Андрей Руссков... in pro.cxx
ну в проде не прокатит )
источник

m

magras in pro.cxx
А если комментарий капсом?)
источник

P

Pepe 🐸 in pro.cxx
magras
Мне лень было искать точный синтаксис, чтобы задать правильное выравнивание, поэтому я использовал то что new char[] имеет максимальное "обычное" выравнивание и добавил комментарий про overalignment. =)
разве через new если ааллцировать то у чар будет макс выравнивание? Я думал только через malloc
источник

P

Pepe 🐸 in pro.cxx
а new выровняет по наименее строгому выравниванию вроде для T
источник

АР

Андрей Руссков... in pro.cxx
правда лучше наверно юзать aligned_alloc чем странную перегрузку operator new, только не забыть что там сначала alignment а потом size указывается
источник

P

Pepe 🐸 in pro.cxx
я имел ввиду в  изначальном примере юзался дефолтный нью
источник

m

magras in pro.cxx
Pepe 🐸
а new выровняет по наименее строгому выравниванию вроде для T
Как всегда для char и компании исключение: https://eel.is/c++draft/expr.new#15
источник

АР

Андрей Руссков... in pro.cxx
Pepe 🐸
а new выровняет по наименее строгому выравниванию вроде для T
ну стандарт не гарантирует что alignof(char) будет больше 1, это обычно уже реализации аллокаторов
источник

АР

Андрей Руссков... in pro.cxx
magras
Как всегда для char и компании исключение: https://eel.is/c++draft/expr.new#15
мда. strictest fundamental align requirement это размер intptr_t?
источник

m

magras in pro.cxx
Андрей Руссков
мда. strictest fundamental align requirement это размер intptr_t?
На это я затрудняюсь ответить, но не думаю что оно прямо привязано к размеру указателя.
источник

АР

Андрей Руссков... in pro.cxx
наверно strictest fundamental align requirement это alignof(biggest fundamental type)
источник

m

magras in pro.cxx
Андрей Руссков
наверно strictest fundamental align requirement это alignof(biggest fundamental type)
На разные типы могут быть разные выравнивания. Может быть на любое целое достаточно 4 байт, а плавающая точка потребует полного выравнивания. Тогда при наличии int128_t  и 64 битном long double выравнивание будет 8 байт. Поэтому без закапывания в гугл и текст стандарта сложно угадать формулировку.
источник

АР

Андрей Руссков... in pro.cxx
типичная проблема стандарта с++ - его невозможно знать
источник