170 похожих чатов

Мне тут в голову идея пришла. А что если при

предоставлении хранилища массивом из unsigned char (или std::byte) на самом деле элементы массива не умирают, так как на их месте создаётся object representation, которое является массивом unsigned char? И по сути происходит прозрачная замена

15 ответов

14 просмотров

это попытка изобрести placement new?

Артём-Колпаков Автор вопроса
Alexander "SonnySlave" Zaitsev
это попытка изобрести placement new?

Не совсем, я пытаюсь понять, можно ли делать вот так alignas(alignof(T)) unsigned char buffer[sizeof(T)]; auto ptr = new (buffer) T; for (auto c : buffer) { ... } или же так делать UB и нужно for (size_t i = 0; i < sizeof(T); ++i) { auto c = reinterpret_cast<unsigned char *>(ptr)[i]; ... }

1) вы сами себе противоречите, одновременно говоря, что элементы массива не умирают и что происходит прозрачная замена. второе действительно имеет место: storage отдельных uchar'ов переиспользуется для uchar'ов представления объекта. поэтому я и считаю, что buffer[i] после placement-new это корректное выражение 2) представление объекта является последовательностью (sequence) uchar'ов, а не массивом. это существенное отличие

Артём-Колпаков Автор вопроса
Vlad
1) вы сами себе противоречите, одновременно говоря...

1) да, приврал немного, не умирают могут всё еще быть использованы 2) раз последовательность отдельных элементов, можно ли считать что каждый элемент заменяет соответствующий подобъект массива по правилу http://eel.is/c++draft/basic.memobj#intro.object-2 ?

Артём Колпаков
1) да, приврал немного, не умирают могут всё еще б...

не уверен, потому что если вы переиспользуете std::byte, последнее условие в том пункте удовлетворено не будет. зачем объяснять это окольным путем через подобъекты, когда есть переиспользование storage и basic.lval#11.3?

Артём-Колпаков Автор вопроса
Vlad
не уверен, потому что если вы переиспользуете std:...

Постараюсь полный путь моих рассуждений привести. Есть массив с живыми элементами unsigned char (только что выделили). Используем его для размещения по правилам предоставления хранилища. Сам массив не умирает, но что насчет его элементов (то есть его подобъектов)? Если они умирают и не происходит прозрачной замены, выражения вида buffer, *buffer, buffer + i, buffer[i] являются указателями/выражениями, ссылающимися на исходные элементы, которые умерли, и в соответствии с http://eel.is/c++draft/basic.memobj#basic.life-6, http://eel.is/c++draft/basic.memobj#basic.life-7 происходит UB. Но если происходит прозрачная замена, то всё нормально. Меня интересует подтверждение стандартом, что именно происходит и в каком порядке.

Артём Колпаков
Постараюсь полный путь моих рассуждений привести. ...

Артем, в который раз прошу объяснить мне, нафига тебе такое надо? Я за хер знает сколько лет промышленной карьеры такое не делал никогда...

Артём-Колпаков Автор вопроса
Ilya Zviagin
Артем, в который раз прошу объяснить мне, нафига т...

Таким образом я постигаю С++, чтобы "преисполниться")

Артём Колпаков
Таким образом я постигаю С++, чтобы "преисполнитьс...

Да это все не нужно никому, в с++ куча всего что постигать надо. Ты уже все постиг остальное? Шаблоны, ООП, полиморфизм, множественное наследование, перегрузку операций?

Артём-Колпаков Автор вопроса
Ilya Zviagin
Да это все не нужно никому, в с++ куча всего что п...

Как по мне, обучение процесс итерационный. Поверхностно прошел, раза 2, без практики конечно забывается, но как только начинаешь писать код, основы быстро вспоминаются. Но у меня плохо с практикой, прошел курс на курсере от яндекса, примеры хорошие, но если нет тестирующей системы, мне сложно что-то делать самостоятельно. Поэтому открыл для себя процесс обучения снизу вверх, когда сначала изучаешь во всей красе все возможности языка, а после уже, читая про более высокоуровневые абстракции думаешь: "Ха, здесь можно применить вот этот механизм языка, вот в этом примере я бы сделал так, тут неоптимально. А, так вот как это работает..." и т.д.

Артём Колпаков
Как по мне, обучение процесс итерационный. Поверхн...

Желаю тебе терпения и как его вознаграждение - успехов на этом длинном и извилистом пути.

Артём Колпаков
Постараюсь полный путь моих рассуждений привести. ...

1) вы создаете массив, пусть, std::byte. начинается время жизни как массива, так и его элементов 2) потом массив provides storage для нового объекта. время жизни массива не заканчивается, но заканчивается время жизни его элементов, потому что их storage переиспользуется для uchar'ов представления нового объекта. условия прозрачной замены при этом не соблюдаются 3) после этого buffer[i] это вполне себе валидное glvalue для работы с uchar'ами представления нового объекта, потому что это явно разрешено basic.lval#11.3

Артём-Колпаков Автор вопроса
Vlad
1) вы создаете массив, пусть, std::byte. начинаетс...

buffer[i] Но не противоречит ли это http://eel.is/c++draft/basic.memobj#basic.life-6 http://eel.is/c++draft/basic.memobj#basic.life-7 ?

Артём Колпаков
buffer[i] Но не противоречит ли это http://eel.is/...

перечитайте внимательно условия в начале этих пунктов

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
Vitaly
9
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
длина пакета фиксированная, или меняется?
Okhsunrog
7
Карта сайта