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

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

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

15 ответов

12 просмотров

это попытка изобрести 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/...

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

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

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

Какой-то там пердун в 90-х решил, что есть какая-то разная типизация. Кого вообще это волнует?
КТ315
49
void terminal_scroll() { memmove(terminal_buffer, terminal_buffer + VGA_WIDTH, buffer_size - VGA_WIDTH); memset(terminal_buffer + buffer_size - VGA_WIDTH, 0, VGA_WIDTH); ...
Егор
47
Всем привет! Подскажите, пожалуйста, в чем ошибка? Настраиваю подключение к MySQL. Либы лежат рядом с exe. Все как по "учебнику"
Евгений
16
А можете как-то проверить меня по знаниям по ассемблеру?
A A
132
Здравствуйте! У меня появилась возможность купить книгу "Изучай Haskell во имя добра!". Но я где-то слышал, что эта книга устарела. Насколько это правда??
E
22
Здравствуйте! Я вот на stepic решаю задачи на хаскеле https://stepik.org/lesson/8443/step/8?unit=1578 мой код import Data.List (isInfixOf) removing :: String -> [String] ->...
E
10
Камрады, кто тесно работал с vtv, хотел уточнить. Ширина column задаётся жёстко на этапе создания дерева или можно в рантайме ее менять программно (не мышкой)?
Ed Doc
10
да ладно ... что там неочевидного ? глянуть в исх-ки датасета и/или кверика чтобы понять в каком месте и как выполняется обращения к св-вам blablaSQL - минутное дело, даже е...
Сергей
7
Здесь для arm кто-нибудь кодит ?
Nothing
52
Всем привет, у меня есть сервер принимающий входящие HTTP подключения, как проверить, что подключение было через прокси или нет, есть какие то поля в заголовках по которым мо...
DS
8
Карта сайта