|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_devАга! Только класс был не "A", а "B".а что будет, если создавался класс А? флажочек заводить, что есть потомки?)) Прэлестно, как говорит Dimitry Sibiryakov )) ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2018, 18:38 |
|
virtual methods
|
|||
---|---|---|---|
#18+
egorychrdb_devАга! Только класс был не "A", а "B".а что будет, если создавался класс А? флажочек заводить, что есть потомки?)) Прэлестно, как говорит Dimitry Sibiryakov ))Вот так: Код: plaintext 1. 2. 3. 4. 5.
?? :) ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2018, 18:52 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Это называется горе от ума )) ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2018, 18:59 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Anatoly Moskovsky, ну, это же не в "продакшн"... Просто эксперименты. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2018, 19:13 |
|
virtual methods
|
|||
---|---|---|---|
#18+
egorychпринцип действия конструкций языка описан в стандарте, знание конкретной реализации не добавляет ничего нового, кроме ложной уверенности в обладании неким сакральным секретом.хмм, да, видимо, так правильнее. a guestЗачем ты придумываешь всякую ерунду?я про то, что: Код: plaintext 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2018, 05:24 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guest, что не так? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2018, 08:54 |
|
virtual methods
|
|||
---|---|---|---|
#18+
CEMbegorychпринцип действия конструкций языка описан в стандарте, знание конкретной реализации не добавляет ничего нового, кроме ложной уверенности в обладании неким сакральным секретом.хмм, да, видимо, так правильнее.Угу! Осталось объяснить это тем, кто пишет boost, компиляторы машинных кодов, потроха операционных систем, драйверы и прочим оптимизаторам. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2018, 09:13 |
|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_devпишет boost, компиляторы машинных кодов, потроха операционных систем, драйверы и прочим оптимизаторам.и как часто ты пишешь всё это? ))) пока ты по ногам себе стреляешь постоянно, несмотря на отличное владение ассемблером ;) ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2018, 12:46 |
|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_devCEMbпропущено... хмм, да, видимо, так правильнее.Угу! Осталось объяснить это тем, кто пишет boost, компиляторы машинных кодов, потроха операционных систем, драйверы и прочим оптимизаторам.Ну-ка покажите пример из boost/потрохов операционных систем, который с точки зрения стандарта С++ приводил бы к UB... Ну разработчики компилятора могут себе такое позволить в исходниках rtl, идущей в комплекте с конкретной версией компилятора. Потому что если в следующей версии компилятора поведение изменится, вместе с компилятором перепишут и rtl. Да, реально видел такое в системных заголовках: Код: plaintext 1.
С точки зрения стандарта, разыменование нулевого указателя - UB. Но разработчик компилятора знает, что в данной конкретной версии так можно. А в следующей минорной версии там может оказаться Код: plaintext 1.
Так что в прикладном коде такие трюки нельзя, если конечно не прибивать гвоздями к конкретному релизу конкретного компилятора, потому что такое может сломаться при любом обновлении. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2018, 20:13 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Barlonerdb_devпропущено... Угу! Осталось объяснить это тем, кто пишет boost, компиляторы машинных кодов, потроха операционных систем, драйверы и прочим оптимизаторам.Ну-ка покажите пример из boost/потрохов операционных систем, который с точки зрения стандарта С++ приводил бы к UB...В boost есть некий вектор (boost/container/vector.hpp), видимо, типа STL-вектора. Вот его оператор доступа по индексу: Код: plaintext 1. 2. 3. 4. 5.
В реализацию m_holder не смотрел, думаю, в этом нет необходимости. В описании complexity для push_back написано "Amortized constant time", а значит в векторе выделяется (и экспоненциально расширяется) кусок нетипизированной памяти, в котором по мере надобности создаются объекты. А что это значит? Это значит, что массива объектов в этом куске памяти нет, а в операторе [] вектора мы видим обращение по индексу, т.е. арифметику указателей. А она, упрощённо говоря, вне массива приводит к UB: http://eel.is/c draft/expr.add#4 Вот, пример UB в boost. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2018, 21:27 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guestа значит в векторе выделяется (и экспоненциально расширяется) кусок нетипизированной памяти, в котором по мере надобности создаются объекты. А что это значит? Это значит, что массива объектов в этом куске памяти нетБуферированный new размещает объекты в уже выделенном куске памяти. Вполне штатно и определённо. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2018, 21:32 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Basil A. Sidorova guestа значит в векторе выделяется (и экспоненциально расширяется) кусок нетипизированной памяти, в котором по мере надобности создаются объекты. А что это значит? Это значит, что массива объектов в этом куске памяти нетБуферированный new размещает объекты в уже выделенном куске памяти. Вполне штатно и определённо.Какой new????? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2018, 21:33 |
|
virtual methods
|
|||
---|---|---|---|
#18+
BarloneНу разработчики компилятора могут себе такое позволить в исходниках rtl, идущей в комплекте с конкретной версией компилятора. Потому что если в следующей версии компилятора поведение изменится, вместе с компилятором перепишут и rtl. Да, реально видел такое в системных заголовках: Код: plaintext 1.
С точки зрения стандарта, разыменование нулевого указателя - UB. Но разработчик компилятора знает, что в данной конкретной версии так можно. А в следующей минорной версии там может оказаться Код: plaintext 1.
Так что в прикладном коде такие трюки нельзя, если конечно не прибивать гвоздями к конкретному релизу конкретного компилятора, потому что такое может сломаться при любом обновлении.Во-первых, эти макродирективы не имеют никакого отношения к разыменованию по нулевому указателю, потому как разыменованием указателя называют выражения, к примеру, следующего вида: Код: plaintext 1.
в качестве lvalue или rvalue. Во-вторых, пора бы уже разобраться, что означает так часто встречающееся в стандарте словосочетание evaluation expression! Поясняю - результат оценки rvalue выражения ( evaluation expression ) вида: Код: plaintext 1.
будет "взятие адреса" , а не доступ к объекту хранения, приводящий к UB, как некоторые до сих пор считают. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2018, 21:33 |
|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_dev, позиция (некоторых) членов комитета такова: результат применения оператора * это lvalue. lvalue обозначает какой-то объект (битовое поле, функцию) http://eel.is/c draft/basic.lval#def:glvalue, http://eel.is/c draft/basic.lval#def:lvalue. Т.к. по нулевому указателю объекта нет, то получается UB, т.к. что такое lvalue, которое не обозначает объекта — не определено. В общем, с этой точки зрения, доступа к объекту (чтения, lvalue-to-rvalue conversion) не нужно, достаточно применения оператора * для наступления UB. rdb_devВо-вторых, пора бы уже разобраться, что означает так часто встречающееся в стандарте словосочетание evaluation expression!Да. Давно пора: http://eel.is/c draft/intro.execution#def:evaluation Evaluation of an expression (or a subexpression) in general includes both value computations (including determining the identity of an object for glvalue evaluation and fetching a value previously assigned to an object for prvalue evaluation) and initiation of side effects. Т.е. determining the identity (lvalue от применения оператора *) — это тоже evaluation of an expression. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2018, 21:43 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guestКакой new?????new (буфер) тип ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2018, 21:51 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Basil A. Sidorova guestКакой new?????new (буфер) типПонятно. UB не в placement new, а в обращении с этой памятью как с содержащей массив с элементами типа T (тип элемента вектора). ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2018, 21:53 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guest, вот именно! Только тут надо уточнить, что подвыражение, это некоторая функционально обособленная (самостоятельная) часть выражения. Например: Код: plaintext 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2018, 22:03 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guestUB не в placement new, а в обращении с этой памятью как с содержащей массив с элементами типа T (тип элемента вектора).Так placement new, насколько я понимаю, именно для того и существует, чтобы получить кусок памяти и работать с ней, как с нужным типом. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2018, 22:05 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Basil A. Sidorov, ладно, объясняю на пальцах. Пусть тип элемента вектора T = int. Вот есть у нас кусок памяти под 4 элемента (для простоты — статический массив): Код: plaintext 1.
Пусть в векторе 3 элемента 5, 10, 33. Их вектор создал с помощью placement new: Код: plaintext 1. 2. 3.
Теперь что примерно делает оператор[]? Вот это Код: plaintext 1. 2. 3. 4.
А это точно приведёт к UB для n == 2, т.к. индексация == адресная арифметика, а она определена только в пределах массива. Никакого массива из int-ов в буфере нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2018, 22:15 |
|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_devТолько тут надо уточнить, что подвыражение, это некоторая функционально обособленная (самостоятельная) часть выражения.Не понимаю, к чему это. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2018, 22:18 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guestладно, объясняю на пальцахЭто всё замечательно, но никто не запрещает (пере)создавать в буфере массив вместо отдельных элементов. Я, по крайней мере, таких запретов не помню. Насколько я помню, в части выделения памяти буферированный new вообще ничего не делает. Следовательно, компилятор просто "верит", что буфер организован именно тем способом, который указан типом. Учитывая, что в плюсах, как и в "предке" массив это указатель на начало куска памяти и (статическая) информация о размере элементов - не вижу в каком месте индексная арифметика становится неопределённой. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2018, 22:28 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Basil A. SidorovЭто всё замечательно, но никто не запрещает (пере)создавать в буфере массив вместо отдельных элементов.Лол?! Вот было в буфере 2 элемента (массив из двух элементов). Сделали push_back. Как создать массив из трёх элементов, начинающийся по тому же адресу, что массив из двух элементов (начало буфера) и сохранить значения первых двух элементов? Basil A. SidorovСледовательно, компилятор просто "верит", что буфер организован именно тем способом, который указан типом.Мне казалось, мы здесь обсуждаем стандарт, а не во что верят компиляторы. Basil A. SidorovУчитывая, что в плюсах, как и в "предке" массив это указательНи в плюсах, ни в предке массив это не указатель. Basil A. Sidorovне вижу в каком месте индексная арифметика становится неопределённой.Ну с уровнем познаний типа "массив это указатель" конечно не видите. Наверное даже ссылку на стандарт (драфт) не заметили. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2018, 22:35 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guestЛол?! Вот было в буфере 2 элемента (массив из двух элементов). Сделали push_back. Как создать массив из трёх элементов, начинающийся по тому же адресу, что массив из двух элементов (начало буфера) и сохранить значения первых двух элементов?Я повторю, что? насколько мне известно, placement new вообще ничего не делает с переданным ему буфером. Поэтому ответ на ваш вопрос зависит от того, что происходит с буфером, а это, в любом случае, происходит вне placement new. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2018, 22:38 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guestrdb_devТолько тут надо уточнить, что подвыражение, это некоторая функционально обособленная (самостоятельная) часть выражения.Не понимаю, к чему это.К тому, что некоторые из присутствующих считают это Код: plaintext 1.
самостоятельной частью выражения, которое таковым, на самом деле, не является, а всё выражение будет оценено как взятие адреса с приведением к size_t. И никакого доступа, приводящего к UB от слова "совсем"! ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2018, 22:39 |
|
|
start [/forum/topic.php?fid=57&msg=39652830&tid=2017692]: |
0ms |
get settings: |
11ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
39ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
64ms |
get tp. blocked users: |
1ms |
others: | 16ms |
total: | 165ms |
0 / 0 |