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

Доброе утро, подскажите, что в данном контексте http://eel.is/c++draft/basic.lval#11 означает слово

access? Его смысл соответствует тому, на что оно ссылается, http://eel.is/c++draft/defns.access, или же тут более широкий смысл, который затрагивает и манипуляции нескалярами? Меня смущает слово dynamic в описании, так как в соответствии с http://eel.is/c++draft/basic.memobj#intro.object-1 и http://eel.is/c++draft/defns.dynamic.type, http://eel.is/c++draft/defns.dynamic.type.prvalue, http://eel.is/c++draft/defns.static.type динамический тип может быть лишь у полиморфных объектов, то есть типа класса, не скаляра, и почему бы тогда просто не написать "the type".
И второй вопрос, говорит ли http://eel.is/c++draft/basic.lval#11.3, что скалярные/любые объекты, то есть память (даже без объектов http://eel.is/c++draft/basic.memobj#basic.life-6.4) можно инспектировать как байты?

63 ответов

98 просмотров

Интроспектировать с какой целью?

Артём-Колпаков Автор вопроса
Ilya Zviagin
Интроспектировать с какой целью?

Не имеет значения, интересует сама возможность

Я ещё почитаю...

Артём Колпаков
Не имеет значения, интересует сама возможность

Имеет значение для понимания твоего вопроса

Артём-Колпаков Автор вопроса
Ilya Zviagin
Имеет значение для понимания твоего вопроса

Инспектировать = читать побайтно значения в памяти

Просто надо принять ванну, выпить чашечку кофе... А не просто с утра стандарт читать.

Артём-Колпаков Автор вопроса
Ilya Zviagin
Просто надо принять ванну, выпить чашечку кофе... ...

Это единственное время, когда я могу заниматься. Время кофе было часа 3 назад)

Артём Колпаков
Инспектировать = читать побайтно значения в памяти

Так читай, что тебе мешает? Проблема будет когда ты что-то с прочитанным будешь делать. Да, при чтении нельзя выходить за границы адреса объекта, естественно

1) access означает ровно то, что написано в defns.access. в том пункте выстраивается цепочка glvalue → object → value: доступ осуществляется к значению, а те три пункта описывают, как между собой должны соотноситься glvalue и объект. 2) ваш вопрос основывается на заведомо ложном утверждении «объекты, то есть память». объекты отделены от памяти, которая их хранит (storage). basic.lval#11.3 действительно дает вам возможность побайтово читать storage, но и только. если под памятью без объектов вы понимаете storage без объекта, то написать программу, которая будет из него побайтово читать, вы сможете, но она будет полагаться на неопределенное поведение согласно basic.life#7.1. если под памятью без объектов вы понимаете «просто» память, не storage, то не уверен, что вы вообще сможете написать такую программу, оставаясь в рамках ISO C++, потому конструкции языка С++ оперируют объектами (intro.object#1)

Артём-Колпаков Автор вопроса
Vlad
1) access означает ровно то, что написано в defns....

По поводу оперирования объектами убедили, и что без объетка обращаться нельзя, тогда я просто могу в хранилище создать массив unsigned char и считывать их, применяя в операции преобразования http://eel.is/c++draft/basic.indet#2, "отмывая". По поводу памяти и storage, memory == storage, так как http://eel.is/c++draft/basic.memobj#intro.memory-1 память есть непрерывная последовательность ОДНОГО или более байт, байт есть the fundamental STORAGE unit, значит storage == memory Но вот по поводу определения access, зачем всё-таки там http://eel.is/c++draft/expr#basic.lval-11.1 the dynamic type, ведь для scalar его dynamic type == static type

Артём-Колпаков Автор вопроса
Vlad
1) access означает ровно то, что написано в defns....

Ой, я не правильно сперва понял вторую часть, конечно же просто памяти быть не может, и если время жизни закончилось, у нас может остаться хранилище (а не просто память)

Артём Колпаков
По поводу оперирования объектами убедили, и что бе...

1) ничего вы не отмоете, потому что std::launder требует, чтобы объект существовал. basic.indet#2 все равно не позволяет вам полагаться на indeterminate values — лишь копировать их туда-сюда с сохранением неопределенности 2) не очень понимаю, к чему часть про storage и память. никто и не спорил, что storage находятся в памяти 3) dynamic type относится не скаляру внутри объекта, а к объекту, который этот скаляр содержит. перечитайте мой ответ, пожалуйста

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

Отмывка не про launder, а про использование неинициализированного значения объекта, что есть случаи, когда это не UB

Артём Колпаков
Отмывка не про launder, а про использование неиниц...

расскажите, что ли, как вы собираетесь их использовать, раз хотите завести это под basic.indet#2

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

Но вот от перечитывания ответа про dynamic type понятнее не становится. Я же привел, что единственный контекст, когда говорят о динамическом типе, это динамический полиморфизм, который никоим образом не относится к scalar type

Артём Колпаков
Но вот от перечитывания ответа про dynamic type по...

Объект может быть одного типа, а реально он другого типа (динамического)

Артём Колпаков
Но вот от перечитывания ответа про dynamic type по...

потому что доступ происходит через glvalue. между glvalue и значением, о которых говорит определение access, есть еще объект. basic.lval#11 предъявляет требования именно к glvalue и объекту, которые могут быть куда сложнее, чем скаляр, в том числе и полиморфическими

Артём-Колпаков Автор вопроса
Vlad
потому что доступ происходит через glvalue. между ...

Просто прошу, привидите мне пример, когда это имеет силу, за исключением указателя(ссылки) на базовый класс, указывающих на объект производного, иначе я не пойму И в контексте вашего ответа про access, объекты в данном вопросе не могут быть сложнее скаляра

Артём Колпаков
Просто прошу, привидите мне пример, когда это имее...

то есть вы считаете, что этот пункт не имеет отношения к примеру ниже, потому что s сложнее, чем скаляр? struct A { int a{0}; int b{0}; }; A s; std::cout << s.a;

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

Строго по определению, здесь обращение к subobject int, как мне кажется, при помощи выражения типа int, а к объекту s нельзя access по определению, им manipulate

Артём Колпаков
Строго по определению, здесь обращение к subobject...

давайте тогда с такой стороны зайдем: если динамический тип объекта это его «истинный» тип, который не зависит от типа выражений, через которые с ним работают, то что вы понимаете под просто типом?

Артём-Колпаков Автор вопроса
Vlad
давайте тогда с такой стороны зайдем: если динамич...

Все, благодарю, дошло. Благо работа связана с ходьбой, голова прояснилась. Данный список как раз представляет варианты статического типа, когда динамический суть истинный тип объекта в хранилище.

Артём-Колпаков Автор вопроса
Vlad
давайте тогда с такой стороны зайдем: если динамич...

И получается, последний пункт говорит, что скалярные объекты можно считать как narrow символьные типы. Но более сложные объекты так считать не получится, такие как объекты типа класса. Я прав?

Артём Колпаков
И получается, последний пункт говорит, что скалярн...

если вы имеете в виду basic.lval#11.3, то он позволяет осуществлять доступ к представлению в памяти любого объекта (basic.types.general#4)

Артём Колпаков
Все, благодарю, дошло. Благо работа связана с ходь...

Можно вопрос: ты язык так вот по стандарту ISO прямо учишь?

Артём-Колпаков Автор вопроса
Vlad
если вы имеете в виду basic.lval#11.3, то он позво...

Но мы же выяснили, что access это обращение к объектам скалярного типа

Артём Колпаков
Но мы же выяснили, что access это обращение к объе...

мы обсуждали 11.1, про доступ через glvalue того же типа, что и динамический тип объекта а 11.3 позволяет получать доступ к значениям и через glvalue типа char/byte

Артём-Колпаков Автор вопроса
Ilya Zviagin
Можно вопрос: ты язык так вот по стандарту ISO пря...

Пару недель. Тут как-то сказали, что нельзя вызывать деструктор для автоматических/статических/тредовых переменных, ну меня в поисках истины и затянуло

Артём-Колпаков Автор вопроса
Vlad
мы обсуждали 11.1, про доступ через glvalue того ж...

Я про то, что в самом начале пункта написано "access"

Артём Колпаков
Я про то, что в самом начале пункта написано "acce...

мне кажется, мы кругами ходим в конструкциях языка С++, с помощью которых осуществляется доступ к значениям (которые могут быть лишь скалярного типа, как гласит примечание к определению access), используются glvalue, которые связаны с объектами, содержащими эти скалярные значения. basic.lval#11 описывает требования к этим glvalue в таких языковых конструкциях

Артём-Колпаков Автор вопроса
Vlad
мне кажется, мы кругами ходим в конструкциях язык...

Я кажется понял, access тут производится с точки зрения статического типа, который в последнем случае скалярный.

Артём Колпаков
Я кажется понял, access тут производится с точки з...

не уверен, что я вас понял, но на всякий случай сделаю еще один акцент: attempts to access the stored value of an object through a glvalue об этих «промежуточных» glvalue на «пути» access'а (в конце которого всегда скаляр) и идет речь

Артём-Колпаков Автор вопроса
Vlad
не уверен, что я вас понял, но на всякий случай сд...

To access through a glvalue => to access through the char (the byte), так?

Артём Колпаков
To access through a glvalue => to access through t...

вы в своей замене не убрали glvalue, а просто опустили through a glvalue of type char, unsigned char or std::byte

Артём-Колпаков Автор вопроса
Vlad
вы в своей замене не убрали glvalue, а просто опус...

Ну да, то есть access это не по взаимодействие с объектами, а про действия с glvalue, так?

Артём Колпаков
Ну да, то есть access это не по взаимодействие с о...

access это про чтение или изменение значений (скаляров). а вот basic.lval#11 это про то, какими должны быть glvalue, когда вы их используете для доступа раз вы говорите про действия с glvalue, то я позволю себе напомнить, что glvalue, как и прочие *value, это разновидности выражений, а не объекты, как можно подумать из названия

Артём-Колпаков Автор вопроса
Vlad
access это про чтение или изменение значений (скал...

Раз с этим разобрались, следующий вопрос. Access подразумевает ещё и модификацию, то есть таким образом возможно менять объекты на уровне байтов?

Артём Колпаков
Раз с этим разобрались, следующий вопрос. Access п...

модификация является доступом, и только. те части стандарта, которые мы тут обсуждаем, никак не регулируют саму возможность читать или изменять значения скажем, изменять константные объекты нельзя. если мне не изменяет память, у скаляров другой принцип: можно менять побайтовое представление, если у типа есть значение, которое соответствует побайтовому представлению после изменения. для object type он тоже может быть справедлив, но ссылок не приведу

Артём-Колпаков Автор вопроса
Vlad
модификация является доступом, и только. те части ...

То есть обсуждаемый пункт говорит, что он запрещает некоторые вещи, а 3 пункта не запрещает (Но не верно, что он их разрешает). И чтение таким образом не запрещено стандартом, когда как модификация скорее всего запрещена где-то?

Артём Колпаков
То есть обсуждаемый пункт говорит, что он запрещае...

basic.life#11 регулирует, какие glvalue можно использовать при доступе к значениям. но ничего не говорит о том, можно ли это делать в принципе

Артём-Колпаков Автор вопроса
Vlad
basic.life#11 регулирует, какие glvalue можно испо...

Хорошо, и раз вы говорите про сериализации, читать через char можно любые объекты, пока они живы, верно?

Артём Колпаков
Хорошо, и раз вы говорите про сериализации, читать...

Можно. Но только standard layout да и то ещё надо паковать структуры... Ну и получишь непереносимое нечто.

Артём Колпаков
Хорошо, и раз вы говорите про сериализации, читать...

как правило, да. вот исключения, которые я сейчас вспомнил: 1) в нашей беседе всплывал basic.indet. не то чтобы там есть ограничения на чтение само по себе, но с прочитанными значениями можно очень мало чего делать. вывести их куда-то (для той же интроспекции) будет UB 2) у представления объектов помимо битов, определяющих значение, есть padding bits. их значение unspecified, то есть их можно прочитать и даже вывести, но стандарт не дает никаких гарантий на предмет того, какие значения вы увидите

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

Да, про indet я увидел, там после операций снова неопределенное получается. Тогда вот такой пример, что я с утра кидал, well-formed? Причем std::string можно заменить на любой тип, да? https://godbolt.org/z/7njh8n

Артём Колпаков
Да, про indet я увидел, там после операций снова н...

насколько я могу судить, ответ утвердительный на оба вопроса. не очень понятно, правда, зачем вам static_cast<int> и почему бы не воспользоваться std::aligned_storage

Артём-Колпаков Автор вопроса
Vlad
насколько я могу судить, ответ утвердительный на о...

Char'ы под hex выводятся как числа? Про вторую функцию я лишь пару дней назад узнать, ещё практики не было

Артём Колпаков
Да, про indet я увидел, там после операций снова н...

а что если строка "Hello, World!" больше размера для SSO? :) зачем тогда такое нью?

Артём-Колпаков Автор вопроса
Pavel Kazakov
а что если строка "Hello, World!" больше размера д...

Отвечаю, меня интересует возможность так делать с любым типом. Строку я для примера привел

Артём Колпаков
Да, про indet я увидел, там после операций снова н...

только тут наверное надо явно деструктор вызвать ещё?

Артём Колпаков
Да, про indet я увидел, там после операций снова н...

наверное, он все-таки ill-formed, потому что вы после вызова placement-new пользуетесь buffer так, будто этот объект еще существует, что неправда, потому что его storage был переиспользован. и критерии transparently replaceable тоже не удовлетворены. наверное, наиболее корректным будет читать байты в цикле через reinterpret_cast<std::byte*>(ptr)[i]

Vlad
наверное, он все-таки ill-formed, потому что вы по...

с другой стороны, это несколько идет вразрез с примером использования aligned_storage на cppref

Vlad
наверное, он все-таки ill-formed, потому что вы по...

Чего-то мне кажется это работать не будет

Артём-Колпаков Автор вопроса
Vlad
наверное, он все-таки ill-formed, потому что вы по...

Соглашусь, только теперь новый вопрос возник. В описании прозрачной замены упоминаются "a pointer that pointed to the original object, a reference that referred to the original object, or the name of the original object", но здесь нет gvalue. Что вообще означают эти сущности в данном контексте? То, что программист вводит объявлением?

Артём Колпаков
Соглашусь, только теперь новый вопрос возник. В оп...

glvalue это подвид выражений скажем, buffer; это expression statement, где выражение является glvalue

Артём Колпаков
Соглашусь, только теперь новый вопрос возник. В оп...

указатели, ссылки и имена это то, из чего вы составляете выражения, которые потом делятся на lvalue, xvalue и prvalue в соответствии со стандартом либо я не понял ваш вопрос

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

Хорошо. Второе сообщение про использование массива после восстановления исходных объектов в нем. Как я описал, они не имеют ни имён, ни указателей, ни ссылок, поэтому прозрачная замена к ним не может относиться.

Vlad
наверное, он все-таки ill-formed, потому что вы по...

@ddvamp я могу ошибаться на этот счет, потому что оператор [] по определению формирует указатель и разыменовывает его. массива там и правда нет, но есть storage другого объекта, к байтам которого мы можем обращаться через такое lvalue-выражение

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
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
Карта сайта