Size: a a a

2020 August 13

AP

Alexander Potapov in pro.cxx
Я вот аллокаторы через маллок всегда делал
источник

CD

Constantine Drozdov in pro.cxx
Alexander Potapov
Я вот аллокаторы через маллок всегда делал
Нешаблонные для интов?
источник

AP

Alexander Potapov in pro.cxx
Шаблонные
источник

AP

Alexander Potapov in pro.cxx
Там был офк плейсмент new
источник

CD

Constantine Drozdov in pro.cxx
Так в шаблонном вы там дергаете размещающее new, а с этого момента все правильно
источник

ПК

Побитый Кирпич... in pro.cxx
Почему жесть?
источник

CD

Constantine Drozdov in pro.cxx
Alexander Potapov
Там был офк плейсмент new
Ошибка именно в том, что размещающего new для инта тут не было
источник

AP

Alexander Potapov in pro.cxx
Для меня просто всегда было нормой массивы байт кастить в другие целочисленные типы, если очень надо
источник

AT

Anatoly Tomilov in pro.cxx
Побитый Кирпич
Почему жесть?
Ну неожиданно как-то. Я конечно всё понимаю. Но уж для каких-нибудь trivially default constructible standard layout типов могли бы исключение сделать.
источник

ПК

Побитый Кирпич... in pro.cxx
Anatoly Tomilov
Ну неожиданно как-то. Я конечно всё понимаю. Но уж для каких-нибудь trivially default constructible standard layout типов могли бы исключение сделать.
Дак сделали
источник

ПК

Побитый Кирпич... in pro.cxx
в С++20
источник

CD

Constantine Drozdov in pro.cxx
Anatoly Tomilov
Ну неожиданно как-то. Я конечно всё понимаю. Но уж для каких-нибудь trivially default constructible standard layout типов могли бы исключение сделать.
Надо еще для int16_t* и int32_t* не убить strict aliasing
источник

AT

Anatoly Tomilov in pro.cxx
Побитый Кирпич
Дак сделали
аа, невнимателен
источник

ПК

Побитый Кирпич... in pro.cxx
Anatoly Tomilov
аа, невнимателен
с С++20 маллок теперь создаёт объекты
источник

AT

Anatoly Tomilov in pro.cxx
а какой-нибудь read(socket, ...);?
источник

ПК

Побитый Кирпич... in pro.cxx
Anatoly Tomilov
а какой-нибудь read(socket, ...);?
тоже наверн
источник

ПК

Побитый Кирпич... in pro.cxx
Там Implementation defined список вроде
источник

m

magras in pro.cxx
Мне все-таки интересно можно ли модифицировать объект через std::byte. Понятно что я могу читать, например для сериализации, и писать для десериализации. Но при десериализации я востанавливаю состояние валидного объекта.

1) Будет ли валиден код восстанавливающий объект из случайного шума?

struct POD { ... };
std::array<std::byte, N> data = get_random_data();
POD* p = new(data.data()) POD;
// use p

2) Если да, будет ли валиден код выполняющий scramble на уровне байтов для живого объекта?

struct POD { ... };
POD pod{};
std::byte* p = reinteret_cast<std::byte*>(&pod);
scrambe(p, sizeof(POD));
// use pod

Я не вижу противоречий со стандартом в обоих случаях. Ни life time, ни strict aliasing вроде не нарушаются. То что объект trivial и standard layout кажется влияет только на первый пример, где от этого зависит будет ли new что-либо делать.

3) Естественно следующим возникает вопрос будет ли валидным код если во втором примере заменить POD на вектор?

std::vector<int> v;
std::byte* p = reinteret_cast<std::byte*>(&v);
scrambe(p, sizeof(v));

Мои предположения:
1) Да, код валиден.
2) Может быть код валиден?
3) Нет, но не могу понять куда смотреть в стандарте.
источник

MM

Mikhail Matrosov in pro.cxx
а что именно сделали, не очень понял?
источник

ПК

Побитый Кирпич... in pro.cxx
Mikhail Matrosov
а что именно сделали, не очень понял?
функции типа malloc неявно начинают lifetime объекта
источник