|
virtual methods
|
|||
---|---|---|---|
#18+
Уважаемые коллеги объясните плиз Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40.
Почему - нет ругани на override без ключевого слова virtual ? - почему даже не будучи virtual o->m(); все равно дергает метод класса С Я все время думал что если метод невирутальный то A o дернет метод на классе А. Поясните плиз тогда зачем вообще оверрайдить метод и снова делать его виртуальным - если вызов и так будет корректным. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.05.2018, 23:01 |
|
virtual methods
|
|||
---|---|---|---|
#18+
semen.s.semen, давай по порядку появления в языке. 1. Сначала было только ключевое слово virtual, которое было обязательлно в базовом классе. Если сигнатура вызова в производном классе совпадала с сигнатурой виртуального метода в базовом классе, то метод был полиморфный. Но для упрощения в производном классе также можно было использовать ключевое слово virtual, чтобы легче читать код (сразу видно, что это общий интерфейс). Но тут существовала проблема: для удобства сделав в производном классе метод virtual и отнаследовавшись от этого производного класса, получали еще один полиморфизм, что не всегда нужно (в твоем случае от В к С). 2. Поэтому в С++11 это "расшили": появилось необязательное (?) ключевое слово override: теперь оно показывает общий интерфейс с базовым классом, а слово virtual- возможность иметь общий интерфейс с производным классом. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.05.2018, 23:19 |
|
virtual methods
|
|||
---|---|---|---|
#18+
semen.s.semen, потому что оверрайд имеет приоритет над виртуализацией ... |
|||
:
Нравится:
Не нравится:
|
|||
21.05.2018, 23:22 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Потому что virtual необязателен в наследнике. Если метод объявлен virtual в предке то он в наследнике тоже virtual. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2018, 00:16 |
|
virtual methods
|
|||
---|---|---|---|
#18+
semen.s.semenЯ все время думал что если метод невирутальный то A o дернет метод на классе А. У тебя метод m - виртуальный. Каким местом ты думал иначе - непонятно. http://en.cppreference.com/w/cpp/language/override Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2018, 00:23 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Так как А объявлен с виртуальным методом, все его потомки будут иметь таблицу виртуальных функций, и там будет m(){}. Dimitry SibiryakovУ тебя метод m - виртуальный. Каким местом ты думал иначе - непонятно.Класса В у него содержит тот самый метод, но не виртуальный, может поэтому и думал? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2018, 05:20 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Siemarglsemen.s.semen, потому что оверрайд имеет приоритет над виртуализацией Это вообще о чём??? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2018, 07:05 |
|
virtual methods
|
|||
---|---|---|---|
#18+
NekZSiemarglsemen.s.semen, потому что оверрайд имеет приоритет над виртуализацией Это вообще о чём???Неверно выразился - если оверрайд, то обязательно и виртуальный тоже. Ссылка на стандарт на 2 поста выше. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2018, 09:40 |
|
virtual methods
|
|||
---|---|---|---|
#18+
SiemarglНеверно выразился - если оверрайд, то обязательно и виртуальный тоже. Ссылка на стандарт на 2 поста выше. Если удалить из программы все override то суть программы не изменится. Это просто такой static_assert для виртуальных функций. А так все правильно ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2018, 10:47 |
|
virtual methods
|
|||
---|---|---|---|
#18+
semen.s.semen, в общем-то, тебе здесь всё, более-менее, расписали, но я рекомендую тебе рассмотреть свой пример с точки зрения ABI: 1. Компилятор создает три таблицы виртуальных методов для классов A, B и C; 2. В vtable класса A у тебя указатель на "void m()" и указатель на деструктор ~A(); 3. В vtable класса B у тебя переопределённый для класса B указатель на "void m()", указатель на ~A() и указатель на ~B(); 4. В vtable класса C у тебя переопределённый для класса C указатель на "void m()", указатель на ~A(), указатель на ~B() и указатель на ~C(); 5. Создавая экземпляр класса C, первым элементом экземпляра класса, доступным по возвращаемому оператором new указателю, является указатель на таблицу виртуальных методов класса C и никакое стандартное приведение типов его не изменит. Изменить поведение виртуальных функций экземпляра класса можно ( это грязный хак ) только изменив указатель на таблицу виртуальных методов другого класса, например на указатель к VTABLE класса A, но, во-первых, для этого необходимо иметь экземпляр класса A в качестве источника, а во-вторых, при попытке разрушить такой объект, не отработают деструкторы ~C() и ~B(), которые должны освободить ресурсы, захваченные конструкторами при создании экземпляра класса C (в твоём вырожденном примере, конструкторы классов никакие ресурсы, типа памяти из кучи, не захватывают); Это тебе для баловства (сделай trace в отладчике): Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8.
;-) ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2018, 11:04 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Кстати а если у класса A виртуальный деструктор - то что будет если у B,С будут невиртуальные деструкторы ? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2018, 11:15 |
|
virtual methods
|
|||
---|---|---|---|
#18+
semen.s.semenКстати а если у класса A виртуальный деструктор - то что будет если у B,С будут невиртуальные деструкторы ?Тебе надо будет дёрнуть деструктор ~B вручную из ~C. Что мешает попробовать? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2018, 11:17 |
|
virtual methods
|
|||
---|---|---|---|
#18+
[offtop] Ну что, форумяне, теперь вы согласитесь со мной, что для лучшего понимания - как всё работает, изучение программирования лучше начинать с ассемблера и ABI ? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2018, 12:01 |
|
virtual methods
|
|||
---|---|---|---|
#18+
semen.s.semenКстати а если у класса A виртуальный деструктор - то что будет если у B,С будут невиртуальные деструкторы ? Если в предке виртуальный, то неважно уже что там в наследниках - они уже по-любому виртуальные. rdb_devТебе надо будет дёрнуть деструктор ~B вручную из ~C. Что мешает попробовать? Не надо. rdb_devНу что, форумяне, теперь вы согласитесь со мной, что для лучшего понимания - как всё работает, изучение программирования лучше начинать с ассемблера и ABI ? Это не всем помогает, как видно ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2018, 12:20 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Anatoly Moskovsky, Спасибо ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2018, 12:27 |
|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_devТебе надо будет дёрнуть деструктор ~B вручную из ~C. Не надо. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2018, 12:33 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Деструкторы родителя дергаются автоматически Это я вчера еще прочитал ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2018, 12:37 |
|
virtual methods
|
|||
---|---|---|---|
#18+
semen.s.semenДеструкторы родителя дергаются автоматически Это если ты уничтожаешь потомка по ссылке на потомка. При уничтожении потомка по ссылке на родителя есть варианты. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2018, 12:39 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakovsemen.s.semenДеструкторы родителя дергаются автоматически Это если ты уничтожаешь потомка по ссылке на потомка. При уничтожении потомка по ссылке на родителя есть варианты. Расскажите поподробнее плиз ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2018, 12:40 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Dimitry SibiryakovЭто если ты уничтожаешь потомка по ссылке на потомка. При уничтожении потомка по ссылке на родителя есть варианты. Если деструктор предка виртуальный то все работает как надо, неважно как удалять. А виртуальный деструктор предка вообще-то нужно делать всегда если есть виртуальные функции. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2018, 12:47 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Anatoly MoskovskyЕсли в предке виртуальный, то неважно уже что там в наследниках - они уже по-любому виртуальные. rdb_devТебе надо будет дёрнуть деструктор ~B вручную из ~C. Что мешает попробовать?Не надо.Ну, забыл я про этот нюанс! Даже не обратил внимания на подсказки IDE NetBeans - значки переопределения на полях. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2018, 13:03 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Anatoly MoskovskyА виртуальный деструктор предка вообще-то нужно делать всегда если есть виртуальные функции. Да. Но не все это помнят и не все версии компиляторов об этом предупреждают. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2018, 13:08 |
|
virtual methods
|
|||
---|---|---|---|
#18+
semen.s.semenА понтов то понтов Где ты увидел, что я понтуюсь? :) Неужели тебе был бесполезен мой пример с указателями на таблицы виртуальных методов? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2018, 13:08 |
|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_devsemen.s.semenА понтов то понтов Где ты увидел, что я понтуюсь? :) Неужели тебе был бесполезен мой пример с указателями на таблицы виртуальных методов? Ну ты отправил меня чего то там проверять вместо того чтобы корректно разобраться Это я называю понтами Я и так вчера запускал код и видел как работают деструкторы Интересно было пообщаться с экспертами ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2018, 13:12 |
|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_devНеужели тебе был бесполезен мой пример с указателями на таблицы виртуальных методов? За это спасибо (в случае если там все корректно) ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2018, 13:13 |
|
virtual methods
|
|||
---|---|---|---|
#18+
авторПочему нет ругани на override без ключевого слова virtual ? Метод уже объявлен виртуальным в классе - предке, в дочернем классе объявление его virtual опциональное, можно написать, можно не писать. Эффект будет одинаковым. В противовес к этому, объявление в дочернем классе метода как override убедится, что данный метод переопределяет родительский, а не объявляет новый виртуальный метод (как было бы с virtual) автор - почему даже не будучи virtual o->m(); все равно дергает метод класса С По той же причине. Объявление метода виртуальным ТОЛЬКО В ПРЕДКЕ достаточно, чтобы он считался виртуальным во всех иерархии классов -наследников от данного базового. авторЯ все время думал что если метод невирутальный то A o дернет метод на классе А. Для этого надо было убрать virtual в базовом классе, A. авторПоясните плиз тогда зачем вообще оверрайдить метод и снова делать его виртуальным - если вызов и так будет корректным. virtual объявляет, что данный метод виртуальный, безотносительно того, был ли он уже объявлен виртуальным в предке. Если ты случайно ошибёшься с названием метода или его сигнатурой (например, забудешь const), то это будет другой метод уже, и его объявление virtual в наследнике введёт новый метод, второй, в число виртуальных методов данного класса. Убедиться, что ты ПЕРЕОПРЕДЕЛЯЕШЬ виртуальный метод базового класса с помощью модификатора virtual невозможно. Можно только вручную проверить с базовым классом полное имя метода и сигнатуру , что они совпадают. Для этого и введено ключевое слово, новый модификатор override. Оно позволяет именно убедится, что данный метод переопределяет виртуальный метод, объявленный в базовом классе, это значит, что у него совпадают имя и сигнатура с базовым классом и в базовом этот метод объявлен как virtual. Если это будет не так, компилятор выдаст ошибку. Кстати, virtual переводится с английского на самом деле не как "виртуальный", а как "действительный" , "настоящий" , что очень сильно помогает понять физический смысл этого объявления. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2018, 13:16 |
|
virtual methods
|
|||
---|---|---|---|
#18+
semen.s.semenНу ты отправил меня чего то там проверять вместо того чтобы корректно разобратьсяПотому и отправил... semen.s.semenЭто я называю понтамиЛадно, пусть будут понты. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2018, 13:18 |
|
virtual methods
|
|||
---|---|---|---|
#18+
semen.s.semenЗа это спасибо (в случае если там все корректно)Ты даже не проповал? :( ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2018, 13:18 |
|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_devsemen.s.semenЗа это спасибо (в случае если там все корректно)Ты даже не проповал? :( Чуть позже сорри ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2018, 13:24 |
|
virtual methods
|
|||
---|---|---|---|
#18+
MasterZivавторПочему нет ругани на override без ключевого слова virtual ? Метод уже объявлен виртуальным в классе - предке, в дочернем классе объявление его virtual опциональное, можно написать, можно не писать. Эффект будет одинаковым. В противовес к этому, объявление в дочернем классе метода как override убедится, что данный метод переопределяет родительский, а не объявляет новый виртуальный метод (как было бы с virtual) автор - почему даже не будучи virtual o->m(); все равно дергает метод класса С По той же причине. Объявление метода виртуальным ТОЛЬКО В ПРЕДКЕ достаточно, чтобы он считался виртуальным во всех иерархии классов -наследников от данного базового. авторЯ все время думал что если метод невирутальный то A o дернет метод на классе А. Для этого надо было убрать virtual в базовом классе, A. авторПоясните плиз тогда зачем вообще оверрайдить метод и снова делать его виртуальным - если вызов и так будет корректным. virtual объявляет, что данный метод виртуальный, безотносительно того, был ли он уже объявлен виртуальным в предке. Если ты случайно ошибёшься с названием метода или его сигнатурой (например, забудешь const), то это будет другой метод уже, и его объявление virtual в наследнике введёт новый метод, второй, в число виртуальных методов данного класса. Убедиться, что ты ПЕРЕОПРЕДЕЛЯЕШЬ виртуальный метод базового класса с помощью модификатора virtual невозможно. Можно только вручную проверить с базовым классом полное имя метода и сигнатуру , что они совпадают. Для этого и введено ключевое слово, новый модификатор override. Оно позволяет именно убедится, что данный метод переопределяет виртуальный метод, объявленный в базовом классе, это значит, что у него совпадают имя и сигнатура с базовым классом и в базовом этот метод объявлен как virtual. Если это будет не так, компилятор выдаст ошибку. Кстати, virtual переводится с английского на самом деле не как "виртуальный", а как "действительный" , "настоящий" , что очень сильно помогает понять физический смысл этого объявления. МастерЗив как всегда на высоте Спасибо ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2018, 13:24 |
|
virtual methods
|
|||
---|---|---|---|
#18+
MasterZivКстати, virtual переводится с английского на самом деле не как "виртуальный", а как "действительный" , "настоящий" , что очень сильно помогает понять физический смысл этого объявления. Сильно сомневаюсь , что такое значение у этого слова существует )) ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2018, 15:35 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Anatoly MoskovskyMasterZivКстати, virtual переводится с английского на самом деле не как "виртуальный", а как "действительный" , "настоящий" , что очень сильно помогает понять физический смысл этого объявления. Сильно сомневаюсь , что такое значение у этого слова существует )) Гуглопереводчик говорит что существует ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2018, 15:39 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Anatoly MoskovskyСильно сомневаюсь , что такое значение у этого слова существует ))Есть схожие. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2018, 15:42 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Виртуальная Реальность в таком случае Реальная Реальность? А мы в какой реальности тогда живём? В первом значении virtual есть виртуальный, ненормальный. Ну... можно конечно сказать it virtually not exist - его практически не существует. Когда говорим о чём то очень редком. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2018, 17:02 |
|
virtual methods
|
|||
---|---|---|---|
#18+
По первой ссылки в гугле: virtual being such in power, force, or effect, though not actually or expressly such Перевод_yandexбыть таковым в силе, силе или действии, хотя на самом деле или явно не таковым в общем, прилагательные русского языка "действительный", "настоящий" (Теперешний, происходящий в данное время.) - вполне подходят IMHO ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2018, 18:30 |
|
virtual methods
|
|||
---|---|---|---|
#18+
OoCcВиртуальная Реальность в таком случае Реальная Реальность? А мы в какой реальности тогда живём? ... На вопрос, в какой мы же реальности... без поллитра не ответить. Тут и выяснится, что после водки - одна реальная, после абсента - другая. А если уж вспомнить и о других веществах изменяющих виртуальную реальность.... то не зря же, скорость это быстрые, а хмурый это хмурый ))) ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2018, 18:34 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Leonid KudryavtsevПо первой ссылки в гугле: virtual being such in power, force, or effect, though not actually or expressly such Перевод_yandexбыть таковым в силе, силе или действии, хотя на самом деле или явно не таковым в общем, прилагательные русского языка "действительный", "настоящий" (Теперешний, происходящий в данное время.) - вполне подходят IMHO Это то что я сказал в своем последнем предложении. oxford dictionaryAlmost or nearly as described, but not completely or according to strict definition. "почти то качество которое следует в последующем описании" - авторit virtually not exist - Не существует но не совсем а почти совсем, есть надежда что всё-таки где-то существует. ИМХО К программированию это значение никак нельзя отнести ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2018, 18:51 |
|
virtual methods
|
|||
---|---|---|---|
#18+
OoCc"почти то качество которое следует в последующем описании" В русском языке для таких вещей есть слова "подделка", "фальшивка" или "(жалкое) подобие". Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2018, 18:56 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Leonid KudryavtsevOoCcВиртуальная Реальность в таком случае Реальная Реальность? А мы в какой реальности тогда живём? ... На вопрос, в какой мы же реальности... без поллитра не ответить. Тут и выяснится, что после водки - одна реальная, после абсента - другая. А если уж вспомнить и о других веществах изменяющих виртуальную реальность.... то не зря же, скорость это быстрые, а хмурый это хмурый ))) Это филосовская тема на пятничный паб. Обсуждение по мере заливкой пивом. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2018, 18:59 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Dimitry SibiryakovOoCc"почти то качество которое следует в последующем описании" В русском языке для таких вещей есть слова "подделка", "фальшивка" или "(жалкое) подобие". Неточно перевёл. Я имел ввиду синтаксическую конструкцию предложения. Мой пример обьясняет что я имел ввиду. Оксфордский словарь очень точно описывает. Понятно и без преревода. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2018, 19:05 |
|
virtual methods
|
|||
---|---|---|---|
#18+
OoCcОксфордский словарь очень точно описывает. Понятно и без преревода. Да хоть переводи, хоть не переводи, получается "как настоящее, только не совсем". Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2018, 19:15 |
|
virtual methods
|
|||
---|---|---|---|
#18+
более близкий пример: run out of space - нет места на диске virtually run out of space - практически нет места на диске. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2018, 19:16 |
|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_devизучение программирования лучше начинать с ассемблера и ABI ?а я всегда так делаю. В ассемблерном коде видны механизмы реализации принципов языка. Тогда некоторые вещи не надо запоминать, так как ты всегда знаешь, как внутри это устроено, и тогда не ставят в тупик всякие хитровывернутые вопросы типа "а что если из виртуального деструктора вызвать виртуальный метод, из какого класса он вызовется?" переводи, хоть не переводитеперь это тред о переводах ... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2018, 05:21 |
|
virtual methods
|
|||
---|---|---|---|
#18+
CEMbи тогда не ставят в тупик всякие хитровывернутые вопросы типа "а что если из виртуального деструктора вызвать виртуальный метод, из какого класса он вызовется?"Встречный вопрос: "Деструктор уже разрушил состояние объекта и вызвал метод объекта - ваши действия?" - не хочется задать? Или это слишком по еврейски? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2018, 06:15 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Basil A. SidorovВстречный вопрос: "Деструктор уже разрушил состояние объекта и вызвал метод объекта - ваши действия?" - не хочется задать?Неее, это другого сорта вопрос Basil A. SidorovИли это слишком по еврейски?Почему это считается по-еврейски? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2018, 08:02 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Basil A. Sidorov"Деструктор уже разрушил состояние объекта и вызвал метод объекта - ваши действия?"Сейчас вспомнил, что мне как-то на собеседовании задали подобный вопрос. На что я начал вести разбор полётов и задавать уточняющие вопросы, чем слегка законфузил интервьюеров. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2018, 08:12 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Basil A. SidorovCEMbи тогда не ставят в тупик всякие хитровывернутые вопросы типа "а что если из виртуального деструктора вызвать виртуальный метод, из какого класса он вызовется?"Встречный вопрос: "Деструктор уже разрушил состояние объекта и вызвал метод объекта - ваши действия?" - не хочется задать? Или это слишком по еврейски?Такая ситуация называется "сам дурак". :) Конечно, иногда программер способен и такое ненарочно написать. Бывает... А что будет, если объект разрушен, память от него ушла на другие нужды, а прога вызывает delete по старому указателю, в надежде, что там живой объект? Тут либо всю программу внимательно прошерстить, либо все обычные указатели заменить на смарт. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2018, 09:25 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Предлагаю переводить слово "virtual", как "мнимый". В этом случае, будем получать точный смысл таких словосочетания, как: virtual reality (мнимая реальность) virtual memory (мнимая память - свопинг данных между оперативной памятью и ЖД) virtual office (мнимый офис - когда работники фиг знает где, но на связи и участвуют в производственном процессе) VPN и т.д. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2018, 11:10 |
|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_devПредлагаю переводить слово "virtual", как "мнимый". В этом случае, будем получать точный смысл таких словосочетания, как: virtual reality (мнимая реальность) virtual memory (мнимая память - свопинг данных между оперативной памятью и ЖД) virtual office (мнимый офис - когда работники фиг знает где, но на связи и участвуют в производственном процессе) VPN и т.д. Применительно к компьютерам Оксфордский словарь так и обьястяет . ... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2018, 12:05 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Вообще-то virtual - это и есть "недо-" "почти" настоящий. Во всех смыслах которые тут обсуждали. Поэтому утверждать что в применении к функциям имелось в виду "действительный", "настоящий" - это неверно, потому что смысл там обратный. На самом деле имелось в виду "недо-функция" - заготовка функции. Это и есть суть виртуальных функций. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2018, 12:36 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Anatoly Moskovsky, еще "псевдо". ... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2018, 13:14 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Dima TAnatoly Moskovskyпропущено... Сильно сомневаюсь , что такое значение у этого слова существует )) Гуглопереводчик говорит что существует В том-то и ирония, что существует. И "виртуальная реальность" -- это не "виртуальная", а "действительная", "реальная", т.е. такая, что почти как настоящая. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2018, 13:35 |
|
virtual methods
|
|||
---|---|---|---|
#18+
OoCcВиртуальная Реальность в таком случае Реальная Реальность? Именно так. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2018, 13:36 |
|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_devBasil A. Sidorovпропущено... Встречный вопрос: "Деструктор уже разрушил состояние объекта и вызвал метод объекта - ваши действия?" - не хочется задать? Или это слишком по еврейски?Такая ситуация называется "сам дурак". :) Конечно, иногда программер способен и такое ненарочно написать. Бывает... А что будет, если объект разрушен, память от него ушла на другие нужды, а прога вызывает delete по старому указателю, в надежде, что там живой объект? Тут либо всю программу внимательно прошерстить, либо все обычные указатели заменить на смарт. Между прочим, в таком случае виртуальный метод работает 100%но нормально, как виртуальный. Например, если в деструкторе потомка будет вызван метод предка, а тот уже вызовет виртуальный метод, переопределённый в том числе в потомке, то будет вызвана реализация из этого потомка. Так что всё 100% ОК. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2018, 13:40 |
|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_devПредлагаю переводить слово "virtual", как "мнимый". В этом случае, будем получать точный смысл таких словосочетания, как: virtual reality (мнимая реальность) virtual memory (мнимая память - свопинг данных между оперативной памятью и ЖД) virtual office (мнимый офис - когда работники фиг знает где, но на связи и участвуют в производственном процессе) VPN и т.д. Не получится так просто. Это многозначное слово, и в зависимости от контекста придётся переводить по-разному. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2018, 13:41 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Вообще насколько я понимаю в супер скоростных проектах идет отказ от исключений и виртуальных методов ... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2018, 13:41 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Anatoly MoskovskyВообще-то virtual - это и есть "недо-" "почти" настоящий. Во всех смыслах которые тут обсуждали. Поэтому утверждать что в применении к функциям имелось в виду "действительный", "настоящий" - это неверно, потому что смысл там обратный. На самом деле имелось в виду "недо-функция" - заготовка функции. Это и есть суть виртуальных функций. С чего ты это вот выдумал -- не понятно. Чем это она недо функция? Чем она заготовка ? Суть виртуальной функции в том, что вызывается реализация исходя из динамического, реального типа данного объекта, а не в соответствии с лексическим типом объектной переменной. Т.е. вызывается ДЕЙСТВИТЕЛЬНАЯ реализация метода. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2018, 13:43 |
|
virtual methods
|
|||
---|---|---|---|
#18+
semen.s.semenВообще насколько я понимаю в супер скоростных проектах идет отказ от исключений и виртуальных методов Ты понимаешь неверно. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2018, 13:44 |
|
virtual methods
|
|||
---|---|---|---|
#18+
MasterZivsemen.s.semenВообще насколько я понимаю в супер скоростных проектах идет отказ от исключений и виртуальных методов Ты понимаешь неверно. Поясни ... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2018, 13:44 |
|
virtual methods
|
|||
---|---|---|---|
#18+
MasterZivЧем это она недо функция? Чем она заготовка ? Потому что где-то там, и позже (в рантайме), будет предоставлена реализация этой функции. А само объявление где указано virtual не является реализацией, а всего лишь заготовкой. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2018, 13:48 |
|
virtual methods
|
|||
---|---|---|---|
#18+
semen.s.semenMasterZivпропущено... Ты понимаешь неверно. Поясни В отдельном топике. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2018, 13:51 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Anatoly MoskovskyА само объявление где указано virtual не является реализацией, а всего лишь заготовкой. Оно (объявление) может быть в том числе и реализацией. Так что не понятно. Ну ладно, это не очень важно, у каждого в голове своя модель языка, главное, чтобы написанная по этой модели программа соответствовала стандарту, а сама модель не важна. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2018, 13:53 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Anatoly MoskovskyMasterZivЧем это она недо функция? Чем она заготовка ? Потому что где-то там, и позже (в рантайме), будет предоставлена реализация этой функции. А само объявление где указано virtual не является реализацией, а всего лишь заготовкой.Кстати да! Потому как то, что называется "чисто мнимыми методами" (pure virtual methods) не имеет реализации изначально, а используются для описания интерфейсной части класса и должны иметь реализацию в инстанцирующимся потомке. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2018, 13:56 |
|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_devAnatoly Moskovskyпропущено... Потому что где-то там, и позже (в рантайме), будет предоставлена реализация этой функции. А само объявление где указано virtual не является реализацией, а всего лишь заготовкой.Кстати да! Потому как то, что называется "чисто мнимыми методами" (pure virtual methods) не имеет реализации изначально, а используются для описания интерфейсной части класса и должны иметь реализацию в инстанцирующимся потомке. Это тоже не так. pure virtual может иметь реализацию (и имеет её всегда даже если ты её не определяешь в коде). Вы просто плохо знаете язык С++. (я тоже фигово, не обольщайтесь) ... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2018, 14:10 |
|
virtual methods
|
|||
---|---|---|---|
#18+
MasterZivОно (объявление) может быть в том числе и реализацией. Так что не понятно. А где я сказал что не может быть реализации по умолчанию? Но это не отменяет того что для виртуальных функций подразумевается отдельная реализация, которой в общем случае не существует на момент компиляции программы. Именно в этом их суть. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2018, 14:22 |
|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_devТакая ситуация называется "сам дурак". :)Позанудствую. Такая ситуация, да, "сам дурак" (чё я на собеседовании и сказал, но мягше). Но речь шла про деструктор. Деструктор сам объект не разрушает, это просто метод, вызываемый перед разрушением объекта, чтобы обслужить данные внутри объекта перед разрушением. Вызывать (виртуальные) методы внутри деструктора можно, если они не используют данные объекта, уже разрушенные в этом или других деструкторах. MasterZivВы просто плохо знаете язык С++. (я тоже фигово, не обольщайтесь)Что же ты, Оби Ван, ты был нашей единственной надеждой! ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2018, 06:02 |
|
virtual methods
|
|||
---|---|---|---|
#18+
CEMbДеструктор сам объект не разрушает, это просто метод, вызываемый перед разрушением объекта, чтобы обслужить данные внутри объекта перед разрушением. Вызывать (виртуальные) методы внутри деструктора можно, если они не используют данные объекта, уже разрушенные в этом или других деструкторах. Результат вызова виртуального метода внутри деструктора зависит от того, в каком именно деструкторе он вызван... Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22.
Сначала вызывается деструктор потомка, и в нем вызывается виртуальный метод потомка. Затем вызывается деструктор предка, потомок уже разрушен, и тут вызывается метод предка. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2018, 07:11 |
|
virtual methods
|
|||
---|---|---|---|
#18+
BarloneCEMbДеструктор сам объект не разрушает, это просто метод, вызываемый перед разрушением объекта, чтобы обслужить данные внутри объекта перед разрушением. Вызывать (виртуальные) методы внутри деструктора можно, если они не используют данные объекта, уже разрушенные в этом или других деструкторах. Сначала вызывается деструктор потомка, и в нем вызывается виртуальный метод потомка. Затем вызывается деструктор предка, потомок уже разрушен, и тут вызывается метод предка.Поверь мне на слово, CEMb совершенно верно написал, что никакого разрушения реально не происходит - после вызова деструктора потомка, память под экземпляром класса не освобождается и деструктор предка абсолютно нормально отработает. Иными словами, объект вполне живой до тех пор, пока не отработают все деструкторы и память не будет освобождена. Задача деструктора - освободить захваченные конструктором ресурсы, но не надо освобождать деструктором конкретного класса то, что не захватывал его конструктор или методы, т.е., если конструктор или методы предка захватили память из кучи и в деструкторе предка есть реализация освобождения этих ресурсов, деструктор потомка не должен эти ресурсы освобождать, хотя и может, если соответствующие члены класса доступны ему через protected или friendly. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2018, 09:44 |
|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_devникакого разрушения реально не происходит - после вызова деструктораКроме синтаксиса есть ещё и семантика. Да, объект, со всеми своими полями - жив и здоров. Но, представим себе, что в одном из полей находится описатель (handle) какого-то (не)системного объекта. Деструктор класса, в котором было объявлено это поле, может (обязан) произвести очистку ресуров и вызвать, например, close(). Вызываемый же метод может полагаться на то, что описателем находится в оперативном (открытом) состоянии. Получится нехорошо. Проблема, разумеется, не зависит от виртуальности метода. Но! Виртуальность добавляет сложности с пониманием того, какой именно из цепочки наследования виртуальных методов будет вызван и в каком состоянии к этому времени находится объект. Разумеется, "погромист семи пядей во лбу" (а кто тут не умный?) всё сделает правильно, но, вроде как, промышленное программирование предполагает создание сопровождаемого кода, а не кабаллистических заклинаний. P.S. Вопрос в скобках был риторическим ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2018, 10:01 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Basil A. SidorovДеструктор класса, в котором было объявлено это поле, может (обязан) произвести очистку ресуров и вызвать, например, close(). Вызываемый же метод может полагаться на то, что описатель находится в оперативном (открытом) состоянии. Получится нехорошо. Проблема, разумеется, не зависит от виртуальности метода. Но! Виртуальность добавляет сложности с пониманием того, какой именно из цепочки наследования виртуальных методов будет вызван и в каком состоянии к этому времени находится объект.Не вижу проблемы! Освободи ресурс, задай хэндлу что-то типа INVALID_HANDLE_VALUE и проверяй его в методах. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2018, 10:44 |
|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_devНе вижу проблемы!"... но умище-то я куда дену?"Освободи ресурс, задай хэндлу что-то типа INVALID_HANDLE_VALUE и проверяй его в методах."А вы на шкаф залезьте". Не решаются, как известно, только три проблемы: смерть, налоги и желание иметь более быстрый компьютер. Тем не менее, некоторые проблемы лучше просто не создавать . ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2018, 11:29 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Basil A. SidorovНе решаются, как известно, только три проблемы: смерть, налоги и желание иметь более быстрый компьютер. Тем не менее, некоторые проблемы лучше просто не создавать .Естественно! Поэтому, если программист написал delete с указателем на объект, а затем дёрнул метод этого объекта, то он сам создал себе проблему. Иными словами, опять получаем ситуацию "сам дурак". Ко всему прочему, если ты создаешь экземпляр класса с каким-то public или protected методом, использующим HANDLE из private члена этого класса, то должен быть готов к тому, что кто-то, наследуя этот класс, создаст себе проблему "сам дурак" и подумать о дуракоустойчивости своей реализации, реализовав в этом методе проверку значения хэндла, а в деструкторе инициализацию хэндла в INVALID_HANDLE_VALUE после закрытия ресурса. Это нормальная практика! ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2018, 11:41 |
|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_devЭто нормальная практика!Нормальная практика исключает использование виртуальных методов и в конструкторах и в деструкторах. А вы пишите о началах проктостоматологии: "Посмотрите, как легко и непринуждённо мы подвесим у себя над головой пудовую гирю, создав несложный абажур из обычных швейных ниток!" ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2018, 12:02 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Basil A. Sidorovrdb_devЭто нормальная практика!Нормальная практика исключает использование виртуальных методов и в конструкторах и в деструкторах. А вы пишите о началах проктостоматологии: "Посмотрите, как легко и непринуждённо мы подвесим у себя над головой пудовую гирю, создав несложный абажур из обычных швейных ниток!" Мне это не очень понятно. Описанный Вами сценарий с закрытием файлов - одинаков, что для виртуальных/что для обычных методов. Не говоря уже о том, что это не столько сценарий, сколько описание банальной ошибки (при это даже не кодирования, а скорее documentation баг) Запрет на вызов виртуальных методов в конструкторе/диструкторе/виртуальном диструкторе.... для меня как-то совсем не очевиден. А если у меня достаточно сложный алгоритм инициализации/убийства и я хочу дать возможность в потомках переопределить поведение "в середине" данного алгоритма? Если без виртуальных методов, то это только переопределять целиком конструктор/диструктор и copy-past... ерунда какая-то получается. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2018, 12:08 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Basil A. Sidorov, какая разница - виртуальный метод или не виртуальный, если программист написал delete, деструктор освободил ресурс, а потом программа дёргает метод, использующий уже освобождённый ресурс? От такой дури спасут только смарт-указатели. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2018, 12:08 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Leonid KudryavtsevЕсли без виртуальных методов, то это только переопределять целиком конструктор/диструктор и copy-past... ерунда какая-то получается.Невиртуальный деструктор предка можно из деструктора потомка и ручками дёрнуть - тоже не проблема... ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2018, 12:10 |
|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_devLeonid KudryavtsevЕсли без виртуальных методов, то это только переопределять целиком конструктор/диструктор и copy-past... ерунда какая-то получается.Невиртуальный деструктор предка можно из деструктора потомка и ручками дёрнуть - тоже не проблема... переопределить поведение " в середине " данного алгоритма или плодить callback'и, что бред. Или virtual методы, просто понятно и красиво. p.s. Сам пытаюсь в конструкторах/деструкторах иметь минимум логики. Но чисто гипотетически, вполне можно представить необходимость такого ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2018, 12:17 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Leonid KudryavtsevА если у меня достаточно сложный алгоритм инициализации/убийства и я хочуГоре от ума. Если вы создаёте избыточно сложную конструкцию, то рано или поздно вы перехитрите самого себя. Или даже не вы, а человек, который унаследовался от вашего объекта и, не подумав (не дочитав документацию), переопределил виртуальный метод. В конструкторах виртуальный метод может вызвать метод (далёкого) потомка до вызова конструктора этого потомка. В лучшем случае вы будете манипулировать неинициализированными полями, в худшем - просто мусором. Аналогично, в деструкторах, виртуальный метод потомка может манипулировать объектом, для предка которого уже вызван деструктор. Поэтому - всё как обычно: вместо того, чтобы бороться с последствиями проблемы, проблему просто не надо создавать. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2018, 12:28 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Basil A. Sidorov... В конструкторах виртуальный метод может вызвать метод (далёкого) потомка до вызова конструктора этого потомка. В лучшем случае вы будете манипулировать неинициализированными полями, в худшем - просто мусором. Аналогично, в деструкторах, виртуальный метод потомка может манипулировать объектом, для предка которого уже вызван деструктор. Поэтому - всё как обычно: вместо того, чтобы бороться с последствиями проблемы, проблему просто не надо создавать. Спасибо за разъяснения. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2018, 12:35 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Basil A. SidorovВ конструкторах виртуальный метод может вызвать метод (далёкого) потомка до вызова конструктора этого потомка. В лучшем случае вы будете манипулировать неинициализированными полями, в худшем - просто мусором. Аналогично, в деструкторах, виртуальный метод потомка может манипулировать объектом, для предка которого уже вызван деструктор.Не может. Ни в конструкторе, ни в деструкторе. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2018, 12:50 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Basil A. SidorovВ конструкторах виртуальный метод может вызвать метод (далёкого) потомка до вызова конструктора этого потомка.неа, не может. конструктор предка не знает, есть у него потомок или нет. Он вызовет свою реализацию метода, если она есть или упадёт с криком "pure virtual function call". если повезёт, а если не повезёт, то предстоят мучительные часы медитации над вопросом почему код, который я написал - вообще не вызывается) . Ну а в деструкторе - обратная проблема ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2018, 12:54 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Вон в стандарте написано (раздел 12.7):Member functions, including virtual functions (10.3), can be called during construction or destruction (12.6.2). When a virtual function is called directly or indirectly from a constructor or from a destructor, including during the construction or destruction of the class’s non-static data members, and the object to which the call applies is the object (call it x) under construction or destruction, the function called is the final overrider in the constructor’s or destructor’s class and not the one overriding it in a more-derived class. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2018, 13:04 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Таким образом, комитет по стандартизации озадачился проблемой настолько, что таблица виртуальных методов специальном образом "хачится" в конструкторах/деструкторах, чтобы, не дай бог, не дёрнуть метод из иерархии предков. Кто там чего говорил про безопасность и понятность вызова виртальных методов в фазе инициализации и разрушения объектов? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2018, 13:22 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Basil A. SidorovТаким образом, комитет по стандартизации озадачился проблемой настолько, что таблица виртуальных методов специальном образом "хачится" в конструкторах/деструкторах, чтобы, не дай бог, не дёрнуть метод из иерархии предков. Ну в стандарте напрямую таблица виртуальных методов вообще не упоминается. Но так то да, в конструкторах и деструкторах помимо вашего кода есть еще немножко: установка указателя vmt, вызов конструктора/деструктора предка. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2018, 13:35 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Basil A. SidorovТаким образом, комитет по стандартизации озадачился проблемой настолько, что таблица виртуальных методов специальном образом "хачится" в конструкторах/деструкторах, чтобы, не дай бог, не дёрнуть метод из иерархии предков.Только не таблица, а указатель на эту таблицу - первый элемент экземпляра класса, на который указывает this. Сама таблица может преспокойно жить в read-only памяти. Иными словами, перед вызовом конструктора/деструктора компилятор вставляет код, меняющий указатель на таблицу виртуальных методов соответствующего класса. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2018, 13:44 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Basil A. Sidorov....таблица виртуальных методов специальном образом "хачится" в конструкторах/деструкторах, чтобы, не дай бог, не дёрнуть метод из иерархии предков.... есть подозрение, что "хачить" ее приходится по причине множественного наследования (где AFAIK тоже есть слова virtual для предков) rdb_dev....Иными словами, перед вызовом конструктора/деструктора компилятор вставляет код, меняющий указатель на таблицу виртуальных методов соответствующего класса. Спасибо. Лично я таких подробностей не знал. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2018, 13:47 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Для множественного наследования есть более-менее нетривиальные правила, которые можно запомнить и научиться применять: в конце-концов, мы знаем, на что идём. Для виртуальных методов в конструкторах/деструкторах "знать" - просто невозможно. Или вы будете работать с полусозданными (полуразрушенными) объектами или вы изменяете механизм виртуализации вызова методов в конструкторах и деструкторах. Комитет выбрал второй вариант, хотя для этого разработчикам компиляторов приходится добавлять в конструкторы и деструкторы больше служебного кода. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2018, 14:01 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Leonid KudryavtsevСпасибо. Лично я таких подробностей не знал.Проверяется несложно - выставляются точки останова в конструкторах и деструкторах по всей иерархии наследования, а в отладчике выставляется наблюдение за (size_t)*this ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2018, 14:04 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Basil A. Sidorov, ну ведь кто-то должен проинициализировать указатель на vmt. Вот он в конструкторе и инициализируется. Тут все вполне логично. Сконструировали предков, выставили адрес vmt, потом выполнили пользовательский код. В деструкторе да, повторное выставление этого указателя - как бы "лишний" код. Ну тут видимо по соображениям симметрии. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2018, 14:07 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Basil A. SidorovКомитет выбрал второй вариант, хотя для этого разработчикам компиляторов приходится добавлять в конструкторы и деструкторы больше служебного кода.Я тебе больше скажу - некоторые компиляторы добавляют в таблицу виртуальных методов указатели на служебные ВИРТУАЛЬНЫЕ конструкторы. :) ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2018, 14:08 |
|
virtual methods
|
|||
---|---|---|---|
#18+
BarloneBasil A. Sidorov, ну ведь кто-то должен проинициализировать указатель на vmt. Вот он в конструкторе и инициализируется. Тут все вполне логично.Это всё понятно. Просто мои наивные представления предполагали, что таблица виртуальных методов будет инициализирована по итоговому (создаваемому) типу - это минимум кода и, соответственно, минимум телодвижений. Если в конструкторах/деструкторах не используются виртуальные методы - этого вполне достаточно. Но, видимо, эстеты от программирования представляют достаточную опасность, чтобы в стандарте заложились на максимально безопасное поведение, не ограничиваясь простым предупреждением о неопределённом поведении. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2018, 14:51 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Basil A. SidorovНо, видимо, эстеты от программирования представляют достаточную опасность, чтобы в стандарте заложились на максимально безопасное поведение, не ограничиваясь простым предупреждением о неопределённом поведении.Потому я и настаиваю на дуракоустойчивой реализации методов, а ты мне - проктостоматология, проктостоматология!... ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2018, 14:55 |
|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_devпроктостоматология, проктостоматология!... У вас есть другое определение для использования виртуальных методах в конструкторах и деструкторах? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2018, 15:00 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Basil A. Sidorov, виртуальные методы не причем, если программист сначала пишет delete ptr, а потом ptr->method(), когда ресурсы уже освобождены, а память кучи из под объекта уже выделена на что-то другое. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2018, 15:04 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Leonid KudryavtsevСпасибо. Лично я таких подробностей не знал.Вот поэтому полезно смотреть, как работает с++ код под ассемблером :) ... |
|||
:
Нравится:
Не нравится:
|
|||
25.05.2018, 05:20 |
|
virtual methods
|
|||
---|---|---|---|
#18+
CEMbВот поэтому полезно смотреть, как работает с++ код под ассемблером :)ага, на каждой версии компилятора, используемого в разработке в текущий момент, искать отличия от предыдущих версий, медитировать над ними... ведь работа не х.., стояла и будет стоять))) ... |
|||
:
Нравится:
Не нравится:
|
|||
25.05.2018, 21:41 |
|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_devнекоторые компиляторы добавляют в таблицу виртуальных методов указатели на служебные ВИРТУАЛЬНЫЕ конструкторы. :)Может ты с деструкторами путаешь? Принеси пример. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.05.2018, 01:58 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Вангую что сейчас прозвучит слово борланд )) ... |
|||
:
Нравится:
Не нравится:
|
|||
26.05.2018, 20:29 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Anatoly MoskovskyВангую что сейчас прозвучит слово борланд ))Не прозвучит, потому что я не помню где наблюдал служебные виртуальные конструкторы. Вполне возможно, что и у Борланда. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.05.2018, 23:31 |
|
virtual methods
|
|||
---|---|---|---|
#18+
egorychага, на каждой версии компилятора, используемого в разработке в текущий момент, искать отличия от предыдущих версий, медитировать над ними... ведь работа не х.., стояла и будет стоять)))ну когда-то же учиться надо. Это не 100 лет назад, когда один раз в 16 лет научился быть плотником, и потом 100 лет ничего не меняется. Тут совсем другая кухня, надо мыслить стратегически День потерял (на изучение новых плюсов) зато потом за 5 минут долетел. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2018, 05:27 |
|
virtual methods
|
|||
---|---|---|---|
#18+
CEMbДень потерял (на изучение новых плюсов) зато потом за 5 минут долетел.для этого стандарт надо читать, или страуструпа, а не в ассемблер лазить. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2018, 12:30 |
|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_devBarloneпропущено... Сначала вызывается деструктор потомка, и в нем вызывается виртуальный метод потомка. Затем вызывается деструктор предка, потомок уже разрушен, и тут вызывается метод предка.Поверь мне на слово, CEMb совершенно верно написал, что никакого разрушения реально не происходит - после вызова деструктора потомка, память под экземпляром класса не освобождается и деструктор предка абсолютно нормально отработает. Иными словами, объект вполне живой до тех пор, пока не отработают все деструкторы и память не будет освобождена. Задача деструктора - освободить захваченные конструктором ресурсы, но не надо освобождать деструктором конкретного класса то, что не захватывал его конструктор или методы, т.е., если конструктор или методы предка захватили память из кучи и в деструкторе предка есть реализация освобождения этих ресурсов, деструктор потомка не должен эти ресурсы освобождать, хотя и может, если соответствующие члены класса доступны ему через protected или friendly. Да, всё так, только "объект вполне живой" -- не совсем верное определение. Точнее, совсем неверное. У объекта в процессе разрушения меняется тип, он их последнего наследника становится сначала предпоследним, потом пред-предпоследним наследником, и так далее, ... потом -- вторым предком, потом --первым предком, потом только разрушается. Т.е. объект "умирает" частями, от наследников к родителям. В обратном порядке к такому же "рождению" по частям от родителей к наследникам. Т.е. "объект вполне живой" -- неверно , определённые подобъекты всего объекта ещё живы, но какие-то подобъекты уже умерли. Для тех, где отработал деструктор уже -- они мертвы, где ещё нет -- являются валидными объектами. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2018, 13:24 |
|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_devAnatoly MoskovskyВангую что сейчас прозвучит слово борланд ))Не прозвучит, потому что я не помню где наблюдал служебные виртуальные конструкторы. Вполне возможно, что и у Борланда. Ага, Борланд и Виртуальные Констукторы! ЕЕЕЕ! У Борланд даже виртуальные статические методы могут быть и даже виртуальные глобальные фукнции! Я верю всему! ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2018, 13:26 |
|
virtual methods
|
|||
---|---|---|---|
#18+
MasterZivrdb_devпропущено... Не прозвучит, потому что я не помню где наблюдал служебные виртуальные конструкторы. Вполне возможно, что и у Борланда. Ага, Борланд и Виртуальные Констукторы! ЕЕЕЕ! У Борланд даже виртуальные статические методы могут быть и даже виртуальные глобальные фукнции! Я верю всему! И они для совместимости с раскладкой дельфийских виртуальных конструкторов объявляемых в registered class. По имени класса в виде строки получаешь описатель класса (указатель на специальный объект) с виртуальными функциями, среди которых функция конструирования экземпляра объекта. Она в классе класса (в С++ прямого аналога нет) виртуальная, но для экземпляра - конструктор. Да, и static virtual есть)))) И оно реально есть и работает ))) Для взятия указателя на функцию которая static virtual берется таблица на указатели не от объекта, а от класса класса (то что в дельфи class of). Берем по имени класса описатель, а у него - да, виртуальная функция и она применяется не к экземпляру класса, а к текущему классу, будучи объявленной в базовом классе )))). Если я чего-то не знаю - это не значит что этого нет. Это значит что я этого не знаю. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2018, 14:04 |
|
virtual methods
|
|||
---|---|---|---|
#18+
MasterZivДа, всё так, только "объект вполне живой" -- не совсем верное определение. Точнее, совсем неверное. У объекта в процессе разрушения меняется тип, он их последнего наследника становится сначала предпоследним, потом пред-предпоследним наследником, и так далее, ... потом -- вторым предком, потом --первым предком, потом только разрушается. Т.е. объект "умирает" частями, от наследников к родителям. В обратном порядке к такому же "рождению" по частям от родителей к наследникам. Т.е. "объект вполне живой" -- неверно , определённые подобъекты всего объекта ещё живы, но какие-то подобъекты уже умерли. Для тех, где отработал деструктор уже -- они мертвы, где ещё нет -- являются валидными объектами.Так-то оно так, но пока память из под объекта не перевыделена и не перезатёрта, этот "зомби" может казаться вполне живым и даже корректно помахивать невиртуальными членами. :) ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2018, 16:12 |
|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_devТак-то оно так, но пока память из под объекта не перевыделена и не перезатёрта, этот "зомби" может казаться вполне живым и даже корректно помахивать невиртуальными членами. :)только вызвать их при разрушении ( без грязных хаков ) нельзя ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2018, 18:24 |
|
virtual methods
|
|||
---|---|---|---|
#18+
egorych, да ну какие грязные хаки при вызове невиртуальных методов? Просто дёрнуть метод по указателю и всё. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2018, 19:53 |
|
virtual methods
|
|||
---|---|---|---|
#18+
egorychCEMbДень потерял (на изучение новых плюсов) зато потом за 5 минут долетел.для этого стандарт надо читать, или страуструпа, а не в ассемблер лазить.Знания без понимания принципов и механик ведут на тёмную сторону -_- Когда ты что-то просто знаешь - ты можешь забыть, или перепутать что-то. Когда ты понимаешь принципы действия, ты можешь получить правильные знания в любой момент сам. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2018, 05:16 |
|
virtual methods
|
|||
---|---|---|---|
#18+
MasterZivДа, всё так, только "объект вполне живой" -- не совсем верное определение. Точнее, совсем неверное.я просто хотел сказать, что в деструкторе надо действовать аккуратно: если (зачем-то) нужно, то обращаться только к тем данным, которые ещё не разрушены. Кстати, такая же, примерно, ситуация с объектами после std::move - формально их трогать нельзя. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2018, 05:20 |
|
virtual methods
|
|||
---|---|---|---|
#18+
CEMbКстати, такая же, примерно, ситуация с объектами после std::move - формально их трогать нельзя.Зачем ты придумываешь всякую ерунду? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2018, 05:29 |
|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_devegorych, да ну какие грязные хаки при вызове невиртуальных методов? Просто дёрнуть метод по указателю и всё.указатель указывает на тип, в котором нет этих методов, помним об этом? мы в деструкторе предка сейчас. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2018, 12:57 |
|
virtual methods
|
|||
---|---|---|---|
#18+
CEMbКогда ты понимаешь принципы действия, ты можешь получить правильные знания в любой момент сам.принцип действия конструкций языка описан в стандарте, знание конкретной реализации не добавляет ничего нового, кроме ложной уверенности в обладании неким сакральным секретом. Вон, в соседнем топике рубятся уже 3 страницы о смысле инструкции push rax, чем это им помогает в понимании С++ я не знаю)) ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2018, 13:06 |
|
virtual methods
|
|||
---|---|---|---|
#18+
CEMbКстати, такая же, примерно, ситуация с объектами после std::move - формально их трогать нельзя. std::move ничего не делает с объектами. А вот move-ctor или move-assignment-operator - да, делают. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2018, 13:27 |
|
virtual methods
|
|||
---|---|---|---|
#18+
egorych, невиртуальные методы есть всегда. Рассмотри такой вариант: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29.
... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2018, 13:28 |
|
virtual methods
|
|||
---|---|---|---|
#18+
egorychВон, в соседнем топике рубятся уже 3 страницы о смысле инструкции push rax, чем это им помогает в понимании С++ я не знаю))Где ты в 4-х комментариях три страницы разглядел? Про назначение push rax в примере уже давно выяснили. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2018, 13:31 |
|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_devegorych, невиртуальные методы есть всегда. Рассмотри такой вариант: Код: plaintext 1. 2. 3. 4. 5. 6.
что будет, если я так напишу, подумай: Код: plaintext 1. 2.
?? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2018, 13:46 |
|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_devegorychВон, в соседнем топике рубятся уже 3 страницы о смысле инструкции push rax, чем это им помогает в понимании С++ я не знаю))Где ты в 4-х комментариях три страницы разглядел? Про назначение push rax в примере уже давно выяснили.это был сарказм))) ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2018, 13:47 |
|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_devegorych, невиртуальные методы есть всегда. Рассмотри такой вариант: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29.
Ну да, выстрелить себе в ногу можно всегда. Примерно с тем же успехом можно сделать и так: Код: plaintext 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2018, 13:50 |
|
virtual methods
|
|||
---|---|---|---|
#18+
egorych Код: plaintext 1. 2. 3. 4. 5. 6.
Это не "грязный", а "чистый" хак. Грязный, это когда ты, например, у экземпляра класса сам меняешь указатель на vtable. egorychчто будет, если я так напишу, подумай: Код: plaintext 1. 2.
??Именно так я и тестировал! Всё прекрасно отработает. :) Ведь деструктор отрабатывает до того, как память будет освобождена. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2018, 15:08 |
|
virtual methods
|
|||
---|---|---|---|
#18+
BarloneНу да, выстрелить себе в ногу можно всегда. Примерно с тем же успехом можно сделать и так: Код: plaintext 1. 2. 3. 4.
Речь не о суициде, а о том, что по типизированному указателю невиртуальные методы работают при любых обстоятельствах. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2018, 15:10 |
|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_devИменно так я и тестировал! Всё прекрасно отработает. :) Жесть ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2018, 15:23 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Barlone, кстати, твой пример прекрасно будет работать, если вручную выставить указатель на vtable. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2018, 15:36 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Забыл дописать - на x86_32 при выравнивании структур на 4 байта. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2018, 15:49 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Anatoly Moskovskyrdb_devИменно так я и тестировал! Всё прекрасно отработает. :) ЖестьАга! Только класс был не "A", а "B". ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2018, 18:17 |
|
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 |
|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_deva guestпропущено... Не понимаю, к чему это.К тому, что некоторые из присутствующих считают это Код: plaintext 1.
самостоятельной частью выражения, которое таковым, на самом деле, не является, а всё выражение будет оценено как взятие адреса с приведением к size_t. И никакого доступа, приводящего к UB от слова "совсем"!Т.е. UB может возникать только в полных выражениях, а в подвыражениях UB не бывает? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2018, 22:42 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Basil A. SidorovЯ повторю, что? насколько мне известно, placement new вообще ничего не делает с переданным ему буфером.А зачем он нужен, если ничего не делает? Можно не вызвать его тогда... Basil A. SidorovПоэтому ответ на ваш вопрос зависит от того, что происходит с буфером, а это, в любом случае, происходит вне placement new.Я рассчитывал на код, который создаёт массив из трёх элементов поверх массива из двух, при этом первые 2 элемента будут содержать те же значение, что и первые 2 элемента старого массива. И это без копирования (иначе откуда возьмётся amortized constant, если мы будем всё копировать?). Было бы забавно увидеть попытки написать такой код. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2018, 22:45 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guestА зачем он нужен, если ничего не делает?Вроде, должно быть очевидно, что placement new позволяет превратить указатель на массив байт в типированный указатель. Цена вопроса - внешнее управление существованием буфера и ручная работа с конструкторами и деструкторами типа. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2018, 22:50 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Basil A. SidorovВроде, должно быть очевидно, что placement new позволяет превратить указатель на массив байт в типированный указатель.Чем он тогда отличается от каста? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2018, 22:54 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guestсамостоятельной частью выражения, которое таковым, на самом деле, не является, а всё выражение будет оценено как взятие адреса с приведением к size_t. И никакого доступа, приводящего к UB от слова "совсем"!Т.е. UB может возникать только в полных выражениях, а в подвыражениях UB не бывает?[/quot]Я же, вроде, до этого ясно написал, про подвыражения... Конечно, UB по нулевому указателю может быть и в подвыражении. Простой пример: Код: plaintext 1. 2. 3.
Неопределенное поведение выделено и является подвыражением rvalue выражения. Кстати, еще хотелось бы ответить, что по своей сути, доступ по указателю (void*)0 не является ошибкой, так как в нулевом адресе адресного пространства процессора нет ничего неопределенного и в данном случае UB лишь условность стандарта и компилятора на его основе. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2018, 22:58 |
|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_devеще хотелось бы ответить,...отметить :) ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2018, 23:02 |
|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_dev, ок. Так в конце-концов что делать с тем, что lvalue по определению обозначает объект, нулевой указатель по определению не указывает ни на какой объект, а результат оператора * это lvalue? Какой объект обозначает это lvalue, если оно применено к нулевому указателю? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2018, 23:02 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guestЧем он тогда отличается от каста?Тем, что это частный случай переопределения оператора "operator new", который работает там, где не работает преобразование void* к нужному типу. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2018, 23:25 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Basil A. Sidorov где не работает преобразование void* к нужному типу.А можно пример где оно не работает? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2018, 23:33 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guestrdb_dev, ок. Так в конце-концов что делать с тем, что lvalue по определению обозначает объект,обозначает любую разыменованную область памяти. a guestнулевой указатель по определению не указывает ни на какой объект,Не надо путать nullptr и NULL. При использовании доступа по указателю NULL ((void*)0) компилятор хоть и выкинет предупреждение UB, но соберёт вполне рабочий код, так как он понятия не имеет, что именно пишет программист - прикладное ПО или же какой-нибудь legacy загрузчик ОС из MBR или BR, который грузится в 0000:7c a guestа результат оператора * это lvalue?не обязательно... Это может быть и prvalue: Код: plaintext 1. 2. 3.
a guestКакой объект обозначает это lvalue, если оно применено к нулевому указателю?Какой тип указателя используешь, такой объект там и будет подразумеваться компилятором. Что у нас там в далёком прошлом под DOS'ом располагалось в самом начале адресного пространства процессора Intel 8086? Таблица векторов прерываний (функций BIOS и DOS вызываемых машинной командой int)? А что располагается сейчас в адресном пространстве пользовательского процесса Windows? 64кБ read-only памяти, каждый байт, которой, проинициализирован значением 0x00? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2018, 23:33 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guestВ 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. Нет там никакого UB в этом коде. UB будет если юзер обратится к индексу за пределами массива. Это будут проблемы юзера, потому что в доке по вектору прямо написано при каких условиях можно []. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2018, 23:34 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guestА можно пример где оно не работает? Код: sql 1.
Тип это примитив или объект, а не указатель на примитив или объект. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2018, 23:38 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Anatoly MoskovskyНет там никакого UB в этом коде.Очевидно, в самом-по-себе коде буста UB нет, ведь это библиотека. UB будет когда юзер вызовет код из буста. Anatoly MoskovskyUB будет если юзер обратится к индексу за пределами массива.Там нет массива, а обращаются памятью так, как будто он там есть. Anatoly MoskovskyЭто будут проблемы юзера, потому что в доке по вектору прямо написано при каких условиях можно [].А из того, что написано в стандарте следует, что больше, чем с n == 0 оператор[] вызывать нельзя, даже если size > 1. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2018, 23:40 |
|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_deva guestrdb_dev, ок. Так в конце-концов что делать с тем, что lvalue по определению обозначает объект,обозначает любую разыменованную область памяти.Ложь. A glvalue is an expression whose evaluation determines the identity of an object, bit-field, or function. (An lvalue is a glvalue that is not an xvalue.) rdb_deva guestнулевой указатель по определению не указывает ни на какой объект,Не надо путать nullptr и NULL.При преобразовании к типу указателя обе этих сущности породят указатель с null pointer value. Я не путаю, мне лень различать, как получилось null pointer value. ( http://eel.is/c draft/basic.compound#def:value,null_pointer ) rdb_deva guestа результат оператора * это lvalue?не обязательно... Это может быть и prvalue:Опять ложь. http://eel.is/c draft/expr.unary.op#1: The unary * operator performs indirection: the expression to which it is applied shall be a pointer to an object type, or a pointer to a function type and the result is an lvalue referring to the object or function to which the expression points. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2018, 23:46 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Basil A. Sidorova guestА можно пример где оно не работает? Код: sql 1.
Тип это примитив или объект, а не указатель на примитив или объект.Стоит пробовать скомпилировать подобное, прежде чем предъявлять. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2018, 23:49 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guestобозначает любую разыменованную область памяти.Ложь. A glvalue is an expression whose evaluation determines the identity of an object, bit-field, or function. (An lvalue is a glvalue that is not an xvalue.)[/quot]И в чем же ложь? В том, что моё определение не соответствует дословно определению стандарта? Где располагаются объекты, битовые поля или код функций? a guestrdb_devНе надо путать nullptr и NULL.При преобразовании к типу указателя обе этих сущности породят указатель с null pointer value. Я не путаю, мне лень различать, как получилось null pointer value. ( http://eel.is/c draft/basic.compound#def:value,null_pointer )На nullptr накладывается больше ограничений - его нельзя напрямую привести к целочисленным типам. a guestrdb_devне обязательно... Это может быть и prvalue:Опять ложь. http://eel.is/c draft/expr.unary.op#1: The unary * operator performs indirection: the expression to which it is applied shall be a pointer to an object type, or a pointer to a function type and the result is an lvalue referring to the object or function to which the expression points.Ну так одним из частных случаев prvalue и есть нереферальный результат lvalue-to-rvalue. Как ты стандарт читал? Смотрим в книгу - видим фигу? Или ты считаешь, что в соответствии со стандартом такая запись: Код: plaintext 1.
"неправомерна" :)? ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 00:09 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guestОчевидно, в самом-по-себе коде буста UB нет Что и требовалось доказать. А то что кто-то обращается к индексу за пределами текущего выделения вектора то это его проблемы, потому что нарушение предусловий вызова функции это и есть UB. Не надо с больной головы переводить на буст )) ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 00:10 |
|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_deva guestrdb_devобозначает любую разыменованную область памяти.Ложь. A glvalue is an expression whose evaluation determines the identity of an object, bit-field, or function. (An lvalue is a glvalue that is not an xvalue.)И в чем же ложь? В том, что моё определение не соответствует дословно определению стандарта? Где располагаются объекты, битовые поля или код функций?Давай-ка я перевормулирую поточнее: lvalue - любая разыменованная область оперативного хранения. Так сойдёт? Или опять скажешь, что "не соответствует стандарту"? :) ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 00:17 |
|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_devИ в чем же ложь? В том, что моё определение не соответствует дословно определению стандарта?Да. Это раздел про C++. Доморощенным определениям тут вряд ли место. А то так каждый будет выдумывать всё, что ему лично в данный момент удобно. rdb_deva guestrdb_devНе надо путать nullptr и NULL.При преобразовании к типу указателя обе этих сущности породят указатель с null pointer value. Я не путаю, мне лень различать, как получилось null pointer value. ( http://eel.is/c draft/basic.compound#def:value,null_pointer )На nullptr накладывается больше ограничений - его нельзя напрямую привести к целочисленным типам.Это, безусловно, играет ключевую роль при преобразовании nullptr к указателю. rdb_devНу так одним из частных случаев prvalue и есть нереферальный результат lvalue-to-rvalueМы обсуждали value category оператора *. Я как бы в курсе, что результат lvalue-to-rvalue conversion это prvalue. rdb_devКак ты стандарт читал?А ты? Что в словосочетании "the result is an lvalue" тебе не ясно? ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 00:18 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Anatoly Moskovskya guestОчевидно, в самом-по-себе коде буста UB нет Что и требовалось доказать.Ни в каком коде никакой библиотеки UB нет. UB будет в программе, которая её вызовет. Это всё, что я хотел сказать. Очевидная вещь. Я думаю, ты как-то не так интерпретировал эти мои слова. Anatoly MoskovskyА то что кто-то обращается к индексу за пределами текущего выделения вектора то это его проблемы, потому что нарушение предусловий вызова функции это и есть UB. Не надо с больной головы переводить на буст ))Ты вообще ничего не понял... :( Посмотри хоть в пример "на пальцах" 21455700 Надеюсь, поможет. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 00:21 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guestrdb_devИ в чем же ложь? В том, что моё определение не соответствует дословно определению стандарта?Да. Это раздел про C++. Доморощенным определениям тут вряд ли место. А то так каждый будет выдумывать всё, что ему лично в данный момент удобно.Это то, что отличает "зубрилок" от вникающих в суть. Зубрилки, порой, дословно цитируют текст, но не могут понять суть того, что они цитируют, а вникающие в суть напротив - не помнят точно текст, но могут своими словами воспроизвести его смысл. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 00:21 |
|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_devrdb_devпропущено... И в чем же ложь? В том, что моё определение не соответствует дословно определению стандарта? Где располагаются объекты, битовые поля или код функций?Давай-ка я перевормулирую поточнееДавай просто возьмём формулировку из стандарта. Это будет самой точной формулировкой, по определению. И мучаться, выдумывать что-то не надо. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 00:23 |
|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_deva guestпропущено... Да. Это раздел про C++. Доморощенным определениям тут вряд ли место. А то так каждый будет выдумывать всё, что ему лично в данный момент удобно.Это то, что отличает "зубрилок" от вникающих в суть. Зубрилки, порой, дословно цитируют текст, но не могут понять суть того, что они цитируют, а вникающие в суть напротив - не помнят точно текст, но могут своими словами воспроизвести его смысл.Я так понял, ты обиделся и перешёл на личности. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 00:26 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guestТы вообще ничего не понял... :( Посмотри хоть в пример "на пальцах" 21455700 Надеюсь, поможет. Зачем мне куда-то смотреть, если было утверждение "пример UB в boost", а в том примере не было UB. Т.е. приведено ложное утверждение. Все. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 00:45 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Anatoly Moskovskya guestТы вообще ничего не понял... :( Посмотри хоть в пример "на пальцах" 21455700 Надеюсь, поможет. Зачем мне куда-то смотреть, если было утверждение "пример UB в boost", а в том примере не было UB. Т.е. приведено ложное утверждение. Все.Ладно, последняя попытка. Я почему-то верю в людей до последнего, хотя обычно оказывается зря. Даже если в векторе, скажем, 5 элементов, доступ к третьему элементу с таким определением оператора[] как в бусте скорее всего приведёт к UB. (Надо всё же проверить определение m_holder, есть малая вероятность что там возвращают из .start() не голый указатель, а класс-обёртку через который отмывают UB). UB в boost в том смысле, что даже, казалось бы, не нарушая требования к вызову функции мы получаем UB. Хотя бы так ясно? ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 00:52 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guestrdb_devпропущено... Давай-ка я перевормулирую поточнееДавай просто возьмём формулировку из стандарта. Это будет самой точной формулировкой, по определению. И мучаться, выдумывать что-то не надо.Давай ка ты сейчас не заглядывая в текст стандарта процитируешь его слово в слово? ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 01:04 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Barlonerdb_devпропущено... Угу! Осталось объяснить это тем, кто пишет boost, компиляторы машинных кодов, потроха операционных систем, драйверы и прочим оптимизаторам.Ну-ка покажите пример из boost/потрохов операционных систем, который с точки зрения стандарта С++ приводил бы к UB...Вот более очевидный пример: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8.
Хоть буст и говорит, что "[data(),data() + size()) is a valid range" с точки зрения стандарта это мало что значит. Вот такое, например Код: plaintext 1. 2.
UB. Конечно, UB как бы в пользовательском коде, т.к. он делает недопустимые операции. Но смысл в том, что переписать boost так, чтобы в использующем его коде не было UB — невозможно в принципе . Поэтому можно сказать, что UB в бусте. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 01:05 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guestЯ так понял, ты обиделся и перешёл на личности.Неа! На что тут обижаться? На то, что ты тычешь мне в нос текст стандарта, который не способен заучить наизусть? Да брось! :) Людей, способных запомнить весь текст стандарта слово в слово во всём мире по пальцам сосчитать. Я не переходил на личности, а продемонстрировал разный подход к прохождению обучения в принципе, а не конкретно по отношению к кому-то. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 01:07 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guestДаже если в векторе, скажем, 5 элементов, доступ к третьему элементу с таким определением оператора[] как в бусте скорее всего приведёт к UB. Еще раз. Не будет UB. Даже если, как вы привели в том втором примере, каждый элемент вектора создавался отдельно через placement new, и "Никакого массива из int-ов в буфере нет. " . Потому что согласно стандарту expr[i] эквивалентно *(expr + i), и никакой массив тут и не требуется. Достаточно чтобы там, по вычисленному адресу, который разыменовывается, был валидный объект, и он там есть. А вот это ваше " т.к. индексация == адресная арифметика, а она определена только в пределах массива. " - вообще ни на чем не основано. Нет такого ограничения. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 01:31 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guestBasil 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-ов в буфере нет. Нет здесь никакого UB ни при buffer[2], ни при buffer[3], ни даже при buffer[15], так как массив типа unsigned char создан на 16 элементов и каждый следующий buffer[n+1] это следующий unsigned char, а не int. Конечно, ты можешь инициализировать этот массив как тебе заблагорассудится! Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9.
... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 01:31 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guestrdb_devНу так одним из частных случаев prvalue и есть нереферальный результат lvalue-to-rvalueМы обсуждали value category оператора *.Мы обсуждали взятие адреса - & BarloneНу разработчики компилятора могут себе такое позволить в исходниках rtl, идущей в комплекте с конкретной версией компилятора. Потому что если в следующей версии компилятора поведение изменится, вместе с компилятором перепишут и rtl. Да, реально видел такое в системных заголовках: Код: plaintext 1.
С точки зрения стандарта, разыменование нулевого указателя - UB. Но разработчик компилятора знает, что в данной конкретной версии так можно. А в следующей минорной версии там может оказаться Код: plaintext 1.
Так что в прикладном коде такие трюки нельзя, если конечно не прибивать гвоздями к конкретному релизу конкретного компилятора, потому что такое может сломаться при любом обновлении. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 01:36 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Anatoly MoskovskyПотому что согласно стандарту expr[i] эквивалентно *(expr + i), и никакой массив тут и не требуется.См. цитату из стандарта ниже. http://eel.is/c draft/expr.add#4 When an expression that has integral type is added to or subtracted from a pointer, the result has the type of the pointer operand. If the expression P points to element x[i] of an array object x with n elements, the expressions P + J and J + P (where J has the value j) point to the (possibly-hypothetical) element x[i+j] if 0≤i+j≤n; otherwise, the behavior is undefined. Likewise, the expression P - J points to the (possibly-hypothetical) element x[i−j] if 0≤i−j≤n; otherwise, the behavior is undefined. Anatoly MoskovskyДостаточно чтобы там, по вычисленному адресу, который разыменовывается, был валидный объект, и он там есть.А вот это ваше "достаточно, чтобы там, по вычисленному адресу, который разыменовывается, был валидный объект" — вообще ни на чём не основано. Нет такого разрешения. Anatoly MoskovskyА вот это ваше " т.к. индексация == адресная арифметика, а она определена только в пределах массива. " - вообще ни на чем не основано. Нет такого ограничения.См. цитату из стандарта выше. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 01:37 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guestAnatoly MoskovskyПотому что согласно стандарту expr[i] эквивалентно *(expr + i), и никакой массив тут и не требуется.См. цитату из стандарта ниже. http://eel.is/c draft/expr.add#4When an expression that has integral type is added to or subtracted from a pointer, the result has the type of the pointer operand. If the expression P points to element x[i] of an array object x with n elements, the expressions P + J and J + P (where J has the value j) point to the (possibly-hypothetical) element x[i+j] if 0≤i+j≤n; otherwise, the behavior is undefined. Likewise, the expression P - J points to the (possibly-hypothetical) element x[i−j] if 0≤i−j≤n; otherwise, the behavior is undefined.И? :) Откомпилируй это: 21455918 и наслаждайся! ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 01:41 |
|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_deva guestпропущено... Мы обсуждали value category оператора *.Мы обсуждали взятие адреса - & Я объяснил, из каких соображений в комитете считают применение оператора * к нулевому указателю UB. И ты полез рассказывать, что это применение не приводит к чтению объекта. И предлагать свои определения для lvalue. 1. Ты правда считаешь, что никто (в комитете и вне его) не знает, что применение оператора * не приводит к доступу к объекту и нужно всех упорно просвещать? 2. Если хочешь сделать код не UB переопределяя lvalue, лучше сделать это в виде предложения в стандарт, а не обижаться тут на форуме. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 01:42 |
|
virtual methods
|
|||
---|---|---|---|
#18+
http://eel.is/c draft/expr.add#4If the expression P points to element x[i] of an array object x with n elements ... Этот пункт стандарта относится к массивам. А вы сами сказали, что "Никакого массива из int-ов в буфере нет. " Зачем на него ссылаетесь? ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 01:43 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Anatoly Moskovsky http://eel.is/c draft/expr.add#4If the expression P points to element x[i] of an array object x with n elements ... Этот пункт стандарта относится к массивам. А вы сами сказали, что "Никакого массива из int-ов в буфере нет. " Зачем на него ссылаетесь? Затем, что дальше написано, что otherwise behavior is undefined. Массива нет — значит при адресной арифметике получается UB. Вроде вопрос был откуда я взял что там UB и откуда требование про массив. Я ответил. Или опять не ясно? ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 01:45 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Anatoly Moskovsky http://eel.is/c draft/expr.add#4If the expression P points to element x[i] of an array object x with n elements ... Этот пункт стандарта относится к массивам.Этот пункт стандарта относится к арифметике указателей. А других-то пунктов и нет =) ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 01:46 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guestrdb_devМы обсуждали взятие адреса - & Я объяснил, из каких соображений в комитете считают применение оператора * к нулевому указателю UB. И ты полез рассказывать, что это применение не приводит к чтению объекта. И предлагать свои определения для lvalue.Что за бред?! Дашь ссылку на комментарий, где я изрёк подобную бредятину? Смотри сюда: 21455820 rdb_deva guestКакой объект обозначает это lvalue, если оно применено к нулевому указателю?Какой тип указателя используешь, такой объект там и будет подразумеваться компилятором. Что у нас там в далёком прошлом под DOS'ом располагалось в самом начале адресного пространства процессора Intel 8086? Таблица векторов прерываний (функций BIOS и DOS вызываемых машинной командой int)? А что располагается сейчас в адресном пространстве пользовательского процесса Windows? 64кБ read-only памяти, каждый байт, которой, проинициализирован значением 0x00?Достаточно аргументированно? ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 01:48 |
|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_deva guestпропущено... Я объяснил, из каких соображений в комитете считают применение оператора * к нулевому указателю UB. И ты полез рассказывать, что это применение не приводит к чтению объекта. И предлагать свои определения для lvalue.Что за бред?! Дашь ссылку на комментарий, где я изрёк подобную бредятину? 21455748 Или в " И никакого доступа, приводящего к UB " под "доступом" не имелась в виду попытка чтения из объекта? ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 01:50 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guestЭтот пункт стандарта относится к массивам.Этот пункт стандарта относится к арифметике указателей. А других-то пунктов и нет =)[/quot]Просто загляни в "legacy" - в стандарт ANSI C и внимательно изучи что такое массив и как работает арифметика типизированных указателей. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 01:50 |
|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_deva guestЭтот пункт стандарта относится к массивам.Этот пункт стандарта относится к арифметике указателей. А других-то пунктов и нет =)Просто загляни в "legacy" - в стандарт ANSI C и внимательно изучи что такое массив и как работает арифметика типизированных указателей.[/quot] А при чём тут стандарт C, если обсуждается стандарт C++? Впрочем, в стандарте C то же самое написано: арифметика указателей разрешена внутри массива When an expression that has integer type is added to or subtracted from a pointer, the result has the type of the pointer operand. If the pointer operand points to an element of an array object , and the array is large enough, the result points to an element offset from the original element such that the difference of the subscripts of the resulting and original array elements equals the integer expression. In other words, if the expression P points to the i-th element of an array object, the expressions (P)+N (equivalently, N+(P)) and (P)-N (where N has the value n) point to, respectively, the i+n-th and i−n-th elements of the array object, provided they exist. Moreover, if the expression P points to the last element of an array object, the expression (P)+1 points one past the last element of the array object, and if the expression Q points one past the last element of an array object, the expression (Q)-1 points to the last element of the array object. If both the pointer operand and the result point to elements of the same array object, or one past the last element of the array object, the evaluation shall not produce an overflow; otherwise, the behavior is undefined . If the result points one past the last element of the array object, it shall not be used as the operand of a unary * operator that is evaluated. Что теперь скажешь? ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 01:53 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guestИли в " И никакого доступа, приводящего к UB " под "доступом" не имелась в виду попытка чтения из объекта?Какой может быть UB при выполнении команд процессора из откомпилированного бинарного файла? Там уже исключения... :) ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 01:53 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guestА при чём тут стандарт C, если обсуждается стандарт C++?А при том, что ANSI C, это LEGACY С++ (читай как "наследство с обременением"). a guestВпрочем, в стандарте C то же самое написано: арифметика указателей разрешена внутри массиваМассивом может быть что угодно. Любой объект можно представить как массив байт, таблицу виртуальных методов можно представить как массив векторов и т.д. и т.п. Для этого даже не обязательно описывать как массив то, что ты хочешь представить как массив. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 01:58 |
|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_deva guestВпрочем, в стандарте C то же самое написано: арифметика указателей разрешена внутри массиваМассивом может быть что угодно. Любой объект можно представить как массивЯ уже понял, что у тебя что угодно может быть чем угодно. Только мы тут C++ обсуждаем. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 02:02 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guestМассивом может быть что угодно. Любой объект можно представить как массивЯ уже понял, что у тебя что угодно может быть чем угодно. Только мы тут C++ обсуждаем.[/quot]Это не у меня, это всегда так было и в C++, и в Си. Именно поэтому на Си до сих пор пишут внутренности операционных систем, прошивки контроллеров и прочую низкоуровневую фигню. :) Ты, случайно, не преподаватель в школе или ВУЗе? ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 02:11 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guestrdb_deva guestМассивом может быть что угодно. Любой объект можно представить как массивЯ уже понял, что у тебя что угодно может быть чем угодно. Только мы тут C++ обсуждаем.Это не у меня, это всегда так было и в C++, и в Си. Именно поэтому на Си до сих пор пишут внутренности операционных систем, прошивки контроллеров и прочую низкоуровневую фигню. :) Ты, случайно, не преподаватель в школе или ВУЗе?После того, как тебе предъявили цитату из стандарта C, в который ты просил посмотреть, ты начал нести какую-то чушь. Я думаю в таком виде продолжать беседу не имеет смысла. От тебя конкретики 0, только переходы на личности и виляния в сторону. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 02:17 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guestПосле того, как тебе предъявили цитату из стандарта C, в который ты просил посмотреть, ты начал нести какую-то чушь. Я думаю в таком виде продолжать беседу не имеет смысла. От тебя конкретики 0, только переходы на личности и виляния в сторону.Для начала, прочти, что представляет из себя массив, почему к нему можно обращаться как к указателю, как осуществляется арифметика типизированных указателей и проверь всё это в отладчике. Потом придёшь и будешь спорить. Ok? :) ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 02:23 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guestЗатем, что дальше написано, что otherwise behavior is undefined. Массива нет — значит при адресной арифметике получается UB. Вроде вопрос был откуда я взял что там UB и откуда требование про массив. Я ответил. Или опять не ясно?Любой типизированный указатель, формально, уже массив. Такая уж особенность у Си и C++... Другое дело, что в реальности никакого массива там может не быть из-за ошибки программиста, но компилятору об этом, порой, ничего не известно. Попробуй найти потенциальную ошибку в этом простом примере: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 03:01 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guestBasil A. SidorovЯ повторю, что? насколько мне известно, placement new вообще ничего не делает с переданным ему буфером.А зачем он нужен, если ничего не делает? Можно не вызвать его тогда... Так это, placement new конструкторы вызывает. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 07:42 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Barlonea guestпропущено... А зачем он нужен, если ничего не делает? Можно не вызвать его тогда... Так это, placement new конструкторы вызывает.Спасибо, я в курсе. Не я утверждал, что placement new ничего не делает. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 09:29 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guestBasil 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-ов в буфере нет.Бред. Или предъяви компилятор, в котором это работает не так как ожидается. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 09:39 |
|
virtual methods
|
|||
---|---|---|---|
#18+
SiemarglБред.Аргументированно. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 09:51 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guestSiemarglБред.Аргументированно.Для тех, кто пользуется компилятором, вполне аргументировано. Религия не позволяет скомпилировать и пройтись отладчиком? ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 10:01 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guestSiemarglБред.Аргументированно.Если почитать тот стандарт, что сам и приводил, и подумать, то (int*)buffer определен для [0..3]. для очистки совести можно завести еще переменную Код: plaintext 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 10:36 |
|
virtual methods
|
|||
---|---|---|---|
#18+
SiemarglЕсли почитать тот стандарт, что сам и приводил, и подумать, то (int*)buffer определен для [0..3]. для очистки совести можно завести еще переменную Код: plaintext 1. 2. 3. 4. 5.
Я ему об этом уже писал 21455915 , но он не читает и ничего компилировать и проверять не хочет. Просто троллит. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 10:43 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Siemargla guestпропущено... Аргументированно.Если почитать тот стандарт, что сам и приводил, и подумать, то (int*)buffer определен для [0..3].А если перечитать ещё раз (внимательно) и ещё подумать (подольше), то прибавление [0..3] к указателю (int*)buffer не определено, т.к. указатель (int*)buffer не является указателем на элемент массива нужного размера, т.к никакого массива из int там вообще нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 10:54 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guestА если перечитать ещё раз (внимательно) и ещё подумать (подольше), то прибавление [0..3] к указателю (int*)buffer не определено, т.к. указатель (int*)buffer не является указателем на элемент массива нужного размера, т.к никакого массива из int там вообще нет.Еще раз (сбился со счёта - в какой) - твой массив состоит из 16-ти элементов unsigned char ( unsigned char buffer[4 * sizeof(int)] ) и в нём прекрасно умещается 4 элемента любого типа размером 4 байта (UINT32, INT32 или int в моделях ILP32, I32LP64, LLP64, LP64), поэтому, для доступа к этим 4-ём элементам int ничто не мешает использовать приведенный к int* указатель на массив buffer, а также использовать арифметику указателей с обычный указателем на unsigned char: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9.
... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 11:32 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guestЗатем, что дальше написано, что otherwise behavior is undefined. Вы читать-то научитесь. Вот вся фраза. "If the expression P points to element x[i] of an array object x with n elements, the expressions P + J and J + P (where J has the value j) point to the (possibly-hypothetical) element x[i+j] if 0≤i+j≤n; otherwise, the behavior is undefined" В ней утверждается,что 1) Если x массив длиной N 2) Есть выражение P равное &x[i] 3) То выражение P + j равно &x[i + j] если 0<=i+j<=n 4) А если не выполняется 0<=i+j<=n, то выражение P + j дает UB (а вовсе не "если это не массив, то UB", как вы в порядке бреда поняли ). ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 11:40 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Anatoly Moskovskya guestЗатем, что дальше написано, что otherwise behavior is undefined. Вы читать-то научитесь. Вот вся фраза. "If the expression P points to element x[i] of an array object x with n elements, the expressions P + J and J + P (where J has the value j) point to the (possibly-hypothetical) element x[i+j] if 0≤i+j≤n; otherwise, the behavior is undefined" В ней утверждается,что 1) Если x массив длиной N 2) Есть выражение P равное &x[i] 3) То выражение P + j равно &x[i + j] если 0<=i+j<=n 4) А если не выполняется 0<=i+j<=n, то выражение P + j дает UB (а вовсе не "если это не массив, то UB", как вы в порядке бреда поняли )."otherwise" относится к "If". Какое-то из условий в if не выполнено — UB. Короче, если ты хочешь показать, что я принёс не ту цитату из стандарта, притащи определение арифметики указателей для случая, когда указатель не указывает на элемент массива. И пруф вот этой Anatoly Moskovskyи никакой массив тут и не требуется. Достаточно чтобы там, по вычисленному адресу, который разыменовывается, был валидный объект чуши. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 11:52 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Siemargla guestпропущено... А если перечитать ещё раз (внимательно) и ещё подумать (подольше), то прибавление [0..3] к указателю (int*)buffer не определено, т.к. указатель (int*)buffer не является указателем на элемент массива нужного размера, т.к никакого массива из int там вообще нет.С тобой нет смысла разговаривать.Естественно. У тебя из "аргументов" только "Бред". Ни одной ссылки на стандарт. Пукнул в лужу, а когда тебе отказались верить без обоснований — слился. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 11:54 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guestAnatoly Moskovsky"If ... if 0≤i+j≤n; otherwise, the behavior is undefined""otherwise" относится к "If".К какому из двух, говорите??? ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 11:56 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Basil A. Sidorova guestпропущено... "otherwise" относится к "If".К какому из двух, говорите???Точку с запятой перед otherwise видишь? Что она значит? Почему там не запятая? ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 11:59 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guest"otherwise" относится к "If". Какое-то из условий в if не выполнено — UB. Нет. Учите язык. Во фразе "If A, B if C; otherwise, D" otherwise относится к if C, потому что во-первых оно ближе, во вторых первый if отделен запятой, то есть это предусловия для всей оставшейся фразы. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 12:01 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guestТочку с запятой перед otherwise видишь? Что она значит? Почему там не запятая?"Ты идешь по очень тонкому льду, мой друг педигрипал" (ц) Кирпич.вводнаяIf the expression P points to element x[i] of an array object x with n elements, логический разделительthe expressions P + J and J + P (where J has the value j) point to the (possibly-hypothetical) element x[i+j]определение эквивалентностиif 0≤i+j≤nусловие, нарушение которого даёт неопределённое поведение. P.S. А точку с запятой, обычно, ставят там, где не хотят начинать новое предложение. "А Владимир Ильич всё бреется; а мог бы и полоснуть". ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 12:13 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Чтобы было еще понятнее "If A, B if C; otherwise, D" надо читать так: "If A and C then B else if not (A and C) then D" ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 12:19 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Упс, запутался раскрывая скобки Вот так: "If A and C then B else if A and not C then D" ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 12:21 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Anatoly Moskovskya guest"otherwise" относится к "If". Какое-то из условий в if не выполнено — UB. Нет. Учите язык.И вам того же. Anatoly MoskovskyВо фразе "If A, B if C; otherwise, D" otherwise относится к if CНет. Anatoly Moskovskyоно ближеВот поэтому приходится использовать точку с запятой, чтобы показать, что otherwise относится ко всему первому простому предложению сложного предложения, а не к ближайшему if. Точка с запятой разделяет (и связывает) более "масштабные" части предложения, чем запятая. Запятая внутри простого предложения, точка с запятой — для разделения (связывания) простых предложений сложного предложения. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 12:26 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Basil A. SidorovА точку с запятой, обычно, ставят там, где не хотят начинать новое предложение.Золотые слова. Подтверждает вышенаписанное мной про разделение простых предложений сложного предложения. Можно превратить сложное предложение в 2 простых, разделив вместо точки запятой точкой. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 12:27 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Anatoly MoskovskyЧтобы было еще понятнеепринеси уже определение арифметики указателей для случая, когда указатель не указывает на элемент массива. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 12:28 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Где найти стандарт, не знаю. Попытался читать результаты гугля по "pointer arithmetic" и складывается ощущение, что a guest прав Наиболее "читаемый" текст по ссылке http://en.cppreference.com/w/cpp/language/operator_arithmetic MSDN так же, про pointer arithmetic говорит исключительно о массивах. Даже в книжке Programming in C: A Tutorial Brian W. Kernighan примеры (одна страничка) исключительно о перемещениях по массиву. IMHO note: стандарта не знаю, не читал. Но в google, что либо противоречащие мнению a.guest найти не смог. Где взять стандарт, не знаю. If any of the operands is a pointer, the following rules apply: * A pointer to non-array object is treated as a pointer to the first element of an array with size 1. * If the pointer P points to the ith element of an array, then the expressions P+n, n+P, and P-n are pointers of the same type that point to the i+nth, i+nth, and i-nth element of the same array, respectively. The result of pointer addition may also be a one-past-the-end pointer (that is, pointer P such that the expression P-1 points to the last element of the array). Any other situations (that is, attempts to generate a pointer that isn't pointing at an element of the same array or one past the end) invoke undefined behavior. * If the pointer P points to the ith element of an array, and the pointer Q points at the jth element of the same array, the expression P-Q has the value i-j, if the value fits in std::ptrdiff_t. Both operands must point to the elements of the same array (or one past the end), otherwise the behavior is undefined. If the result does not fit in std::ptrdiff_t, the behavior is undefined. * In any case, if the pointed-to type is different from the array element type, disregarding cv qualifications, at every level if the elements are themselves pointers, the behavior of pointer arithmetic is undefined. In particular, pointer arithmetic with pointer to base, which is pointing at an element of an array of derived objects is undefined. * If the value 0 is added or subtracted from a pointer, the result is the pointer, unchanged. If two pointers point at the same object or are both one past the end of the same array, or both are null pointers, then the result of subtraction is equal to (std::ptrdiff_t)0. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 12:52 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Leonid KudryavtsevГде найти стандарт, не знаю.Можно просто драфты смотреть, не обязательно покупать стандарт. Текущая версия с удобной навигацией http://eel.is/c draft/ Сборник драфтов в .pdf-формате https://github.com/cplusplus/draft/tree/master/papers ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 12:55 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guestBasil 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-ов в буфере нет.На самом деле, UB тут есть, но совсем в другом месте. unsigned char buffer[4*sizeof(int)] не гарантирует нужного для int выравнивания, и даже обращение к ((int *)buffer)[0] может привести к проблемам. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 13:18 |
|
virtual methods
|
|||
---|---|---|---|
#18+
BarloneНа самом деле, UB тут есть, но совсем в другом месте. unsigned char buffer[4*sizeof(int)] не гарантирует нужного для int выравнивания, и даже обращение к ((int *)buffer)[0] может привести к проблемам.Считай, там есть alignas(int) и с созданием объектов с помощью placement new всё в порядке. ((int *)buffer)[0] тоже в порядке. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 13:21 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guestЕсли почитать тот стандарт, что сам и приводил, и подумать, то (int*)buffer определен для [0..3].А если перечитать ещё раз (внимательно) и ещё подумать (подольше), то прибавление [0..3] к указателю (int*)buffer не определено, т.к. указатель (int*)buffer не является указателем на элемент массива нужного размера, т.к никакого массива из int там вообще нет.[/quot]Но вот это точно бред. С памятью, выделенной malloc, работать как с массивом вообще никак нельзя, да? ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 13:22 |
|
virtual methods
|
|||
---|---|---|---|
#18+
упс, что-то с цитированием... ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 13:23 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guest((int *)buffer)[0] тоже в порядке.Ну или не в порядке, но std::launder я показывать не хочу, у народа с пониманием более простых вещей тут явные проблемы. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 13:23 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guestпринеси уже определение арифметики указателей для случая, когда указатель не указывает на элемент массива. Сначала докажите что там не массив ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 13:24 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Ну так посмотрите: 7.2 Array-to-pointer conversion . ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 13:25 |
|
virtual methods
|
|||
---|---|---|---|
#18+
BarloneНо вот это точно бред. С памятью, выделенной malloc, работать как с массивом вообще никак нельзя, да? По драфту... если переводить дословно... нет ))), нельзя ))) http://eel.is/c draft/expr.add For addition or subtraction, if the expressions P or Q have type “pointer to cv T”, where T and the array element type are not similar, the behavior is undefined. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 13:26 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guestМожно просто драфты смотреть, не обязательно покупать стандарт. Текущая версия с удобной навигацией http://eel.is/c draft/ Сборник драфтов в .pdf-формате https://github.com/cplusplus/draft/tree/master/papers Давай будем читать "твои" черновики вместе... :) draftWhen an expression that has integer type is added to or subtracted from a pointer, the result has the type of the pointer operand. If the pointer operand points to an element of an array object, and the array is large enough, the result points to an element offset from the original element such that the difference of the subscripts of the resulting and original array elements equals the integer expression. In other words, if the expression P points to the i-th element of an array object, the expressions (P)+N (equivalently, N+(P)) and (P)-N (where N has the value n) point to, respectively, the i+n-th and i−n-th elements of the array object, provided they exist. Moreover, if the expression P points to the last element of an array object, the expression (P)+1 points one past the last element of the array object, and if the expression Q points one past the last element of an array object, the expression (Q)-1 points to the last element of the array object. If both the pointer operand and the result point to elements of the same array object, or one past the last element of the array object, the evaluation shall not produce an overflow; otherwise, the behavior is undefined. If the result points one past the last element of the array object, it shall not be used as the operand of a unary * operator that is evaluated. ПереводКогда выражение, имеющее целочисленный тип прибавлено или вычтено из указателя, результат имеет тип операнда указателя. Если операнд указателя указывает на объект элемента массива и массив достаточно велик, результат указывает на смещение элемента от начального элемента так, что разница индексов результирующего и начального элемента массива является целочисленным выражением. Иными словами, если выражение P указывает на i-тый объект элемента массива, выражение (P)+N (в арифметике указателей тоже, что N+(P)) и (P)-N (где N имеет значение n) указывают, соответственно, на i+n-ый и i-n-ый объект элементов массива, если они существуют. Более того, если выражение P указывает на объект последнего элемента массива, выражение (P)+1 указывает следующий объект элемента массива после последнего и если выражение Q указывает следующий после последнего объект элемента массива, выражение (Q)-1 указывает на последний объект элемента массива. Если оба, и операнд указателя, и результат указывают на один и тот же объект массива или на следующий за последним объект элемента массива, результатом оценки выражения не должно являться переполнение, в противном случае, поведение не определено. Если результат указыват на следующий за последним объект элемента массива, этот результат не должен быть использован в качестве операнда унарного оператора * (разыменование указателя). Примечание: Здесь под элементом массива понимается некая абстрактная единица хранения массива, имеющая размер хранящегося в ней объекта, а под объектом элемента понимается экземпляр любого типа, хранящийся в элементе массива, а не только экземпляр какого-либо класса. Иными словами, для твоего примера: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9.
А теперь попробуй пояснить, как компилятор должен определить UB в подобном примере: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 13:28 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Barlonea guestBarloneЕсли почитать тот стандарт, что сам и приводил, и подумать, то (int*)buffer определен для [0..3].А если перечитать ещё раз (внимательно) и ещё подумать (подольше), то прибавление [0..3] к указателю (int*)buffer не определено, т.к. указатель (int*)buffer не является указателем на элемент массива нужного размера, т.к никакого массива из int там вообще нет.Но вот это точно бред.Аргументированно, как обычно на этом форуме. BarloneС памятью, выделенной malloc, работать как с массивом вообще никак нельзя, да?Пока там не создан массив с помощью placement new — нельзя. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 13:29 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guest, так вы правда утверждаете, что с памятью, выделенной malloc, нельзя работать как с массивом? ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 13:29 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Anatoly Moskovskya guestпринеси уже определение арифметики указателей для случая, когда указатель не указывает на элемент массива. Сначала докажите что там не массив Запросто: его там не создавали, значит его там нет. Если вы не знаете таких базовых вещей (как создаются объекты в C++), зачем лезете? ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 13:33 |
|
virtual methods
|
|||
---|---|---|---|
#18+
ну в целом смысл закладываемый драфтом, понятен 1) за "ручное" cast'ование типов, draft ответственности не несет. 2) операции могут перегружаться. Т.ч. даже "выход за пределы массива" (кроме элемента сразу за последним), undefined. Т.к. если там какая-то коллекция, то она может такие факты и проверить. IMHO P.S. Перефразируя известное проклятие "что бы тебе всю жизнь программировать строго следуя спецификациям" ))) ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 13:35 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Barlonea guestBasil 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-ов в буфере нет.На самом деле, UB тут есть, но совсем в другом месте. unsigned char buffer[4*sizeof(int)] не гарантирует нужного для int выравнивания, и даже обращение к ((int *)buffer)[0] может привести к проблемам. Такое бывает на некоторых архитектурах (int только по четным адресам), но тогда placement new бы ругнулся ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 13:36 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guestЗапросто: его там не создавали, значит его там нет. Код: plaintext 1. 2. 3.
Вот тут массив создан или нет? ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 13:37 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev1) за "ручное" cast'ование типов, draft ответственности не несет.То есть? Поведение многих кастов вполне описано и определено. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 13:37 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Anatoly Moskovskya guestЗапросто: его там не создавали, значит его там нет. Код: plaintext 1. 2. 3.
Вот тут массив создан или нет?Детсадовская попытка подловить, дописав что-нибудь над и под фигурными скобками, которые сделают любой мой ответ неверным? ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 13:39 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guestBarloneпропущено... Но вот это точно бред.Аргументированно, как обычно на этом форуме. 21457288 Какие тебе еще нужны аргументы? :) a guestBarloneС памятью, выделенной malloc, работать как с массивом вообще никак нельзя, да?Пока там не создан массив с помощью placement new — нельзя. Неужели? Забавно, но в Си нет ни new, ни placement new, однако, библиотечным функциям работы со строками (strlen, strcpy и т.д.), а также библиотечным функциям работы с памятью (memcpy, memset, memmove и т.д.) сей факт абсолютно никак не мешает, при том, что Си, как я уже упоминал, является для C++ наследием. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 13:40 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guestAnatoly Moskovskyпропущено... Сначала докажите что там не массив Запросто: его там не создавали, значит его там нет. Если вы не знаете таких базовых вещей (как создаются объекты в C++), зачем лезете? В мемориз! Скриньте это, парни!!! ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 13:41 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guestКак, если ты даже не умеешь читать? Покажи, с какого драфта ты скопировал то, что у тебя написано под спойлером.С какого драфта ты это цитировал, с того и взято. Я просто взял твою цитату драфта. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 13:42 |
|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_deva guestПока там не создан массив с помощью placement new — нельзя. Неужели? Забавно, но в Си нет ни new, ни placement new, однако, библиотечным функциям работы со строками (strlen, strcpy и т.д.), а также библиотечным функциям работы с памятью (memcpy, memset, memmove и т.д.) сей факт абсолютно никак не мешаетВ C и C++ разная семантика создания объектов. Аналогии с C тут не к месту. rdb_devСи, как я уже упоминал, является для C++ наследием.Отсюда не следует ничего. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 13:44 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guestДетсадовская попытка подловить, дописав что-нибудь над и под фигурными скобками, которые сделают любой мой ответ неверным? Код: plaintext 1. 2. 3. 4.
Ответ-то есть? ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 13:47 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Anatoly Moskovskya guestДетсадовская попытка подловить, дописав что-нибудь над и под фигурными скобками, которые сделают любой мой ответ неверным? Код: plaintext 1. 2. 3. 4.
Ответ-то есть?Открой стандарт (или драфт). Там написано, как создаются объекты. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 13:48 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guestrdb_devпропущено... Неужели? Забавно, но в Си нет ни new, ни placement new, однако, библиотечным функциям работы со строками (strlen, strcpy и т.д.), а также библиотечным функциям работы с памятью (memcpy, memset, memmove и т.д.) сей факт абсолютно никак не мешаетВ C и C++ разная семантика создания объектов. Аналогии с C тут не к месту.В Си нет классов, а массивы есть! :) a guestrdb_devСи, как я уже упоминал, является для C++ наследием.Отсюда не следует ничего.Как же не к месту, если C++ полностью наследует Си, включая создание массивов, приведение указателей и арифметику указателей? O_o ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 13:48 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guestLeonid Kudryavtsev1) за "ручное" cast'ование типов, draft ответственности не несет.То есть? Поведение многих кастов вполне описано и определено. Я про желание скастовать массив char[] в массив int[] rdb_deva guestпропущено... Запросто: его там не создавали, значит его там нет. Если вы не знаете таких базовых вещей (как создаются объекты в C++), зачем лезете? В мемориз! Скриньте это, парни!!! Вот честно говоря, ничего смешного не увидел A.Quest совершенно прав Там массив char (и при этом даже "не сырая" память от какого нибудь malloc'а, а "честный" массив char) А массив int, это массив другого типа. То, что это относительно однозначно будет работать на Intel архитектуре - всем понятно. Но стандарты на язык пишутся для разных архитектур. Об одном подводном камне (выравнивание) уже вспомнили. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 13:52 |
|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_devC++ полностью наследует СиЭто не так. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 13:54 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Leonid KudryavtsevОб одном подводном камне (выравнивание) уже вспомнили.Я просто забыл написать alignas. Цель примера была показать не проблемы с выравниванием, об этом и так многие знают. Считайте, что с выравниванием всё ок. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 13:56 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guestОткрой стандарт (или драфт). Там написано, как создаются объекты. Понятно, т.е. ответа нет. Из этого можно сделать вывод что мальчик путает созданный массив и проинициализированный массив, и не считает первое массивом ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 13:57 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Leonid KudryavtsevТо, что это относительно однозначно будет работать на Intel архитектуре - всем понятно. Но стандарты на язык пишутся для разных архитектур. Об одном подводном камне (выравнивание) уже вспомнили.То есть, предлагаешь проверить всё это в g++ подобном компиляторе на платформе "Эльбрус", где существует некоторая типизация хранимых в памяти данных на уровне процессора? Не поверишь, но обычный Линух, собранный их же g++ подобным компилятором, работает на этой платформе, а в потрохах Линуха чего только нет... ;) ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 13:57 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Anatoly Moskovskya guestОткрой стандарт (или драфт). Там написано, как создаются объекты. Понятно, т.е. ответа нет.Ты настолько беспомощен, что не можешь найти http://eel.is/c draft/intro.object#def:object ? Я даже процитирую сюда http://eel.is/c draft/intro.object#def:object An object is created by a definition ([basic.def]), by a new-expression, when implicitly changing the active member of a union ([class.union]), or when a temporary object is created ([conv.rval], [class.temporary]). Если int a[2]; у тебя это definition, то да, там массив создаётся. Anatoly MoskovskyИз этого можно сделать вывод что мальчик путает созданный массив и проинициализированный массив, и не считает первое массивом Мимо, как обычно. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 14:01 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsevrdb_devпропущено... В мемориз! Скриньте это, парни!!!Вот честно говоря, ничего смешного не увидел A.Quest совершенно прав Там массив char (и при этом даже "не сырая" память от какого нибудь malloc'а, а "честный" массив char) А массив int, это массив другого типа. То, что это относительно однозначно будет работать на Intel архитектуре - всем понятно. Но стандарты на язык пишутся для разных архитектур. Об одном подводном камне (выравнивание) уже вспомнили.Тогда объясни мне пожалуйста такой момент: Допустим, я пишу на C++ какой-нибудь GRUB подобный загрузчик, работающий в реальном режиме адресации процессора семейства Intel x86 и мне надо перехватить прерывание divide by zero, перенаправив обработку этого исключения на свой обработчик этого прерывания, если: a) Таблица векторов прерываний располагается по адресу 0000:0; б) Я в своей программе не размещал и не инициализировал массив этой таблицы векторов прерываний по адресу 0000:0 (это сделал BIOS); в) Вектор прерывания divide by zero является первым элементом этой таблицы, а взятие элемента по нулевому указателю, это UB; Или, например, такой вариант: MS DirectX использует прямой доступ к памяти видеоконтроллера, картированной на адресное пространство процессора. Как реализация DirectX должна работать с видеопамятью, если она не создавала этот "массив байт" видеопамяти, в котором находится массив структур RGB которые, при разных режимах работы видеоконтроллера, могут иметь разный размер - от 2 до 4-х байт? :) ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 14:17 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guestЯ даже процитирую сюда Правильно. Тот кто утверждает чушь и должен работать доказывая свои утверждения. Остальным-то чего напрягаться. Теперь доказывайте, что конструкция в которой в массиве uchar[] по очереди созданы элементы типа T, при том что все они помещаются внутрь того массива, не является массивом. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 14:24 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Anatoly MoskovskyПравильно. Тот кто утверждает чушь и должен работать доказывая свои утверждения.Тогда почему ты утверждаешь чушь и не особо спешишь её обосновывать? Anatoly MoskovskyТеперь доказывайте, что конструкция в которой в массиве uchar[] по очереди созданы элементы типа T, при том что все они помещаются внутрь того массива, не является массивом.Отсутствие не доказывают. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 14:27 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guestТогда почему ты утверждаешь чушь и не особо спешишь её обосновывать? Ну, это же не я написал "вот код в котором UB". Придется доказывать тому кто написал. Пока не видно доказательства. Вместо этого видно, что утвержается что пол-языка это UB. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 14:30 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Anatoly Moskovskya guestТогда почему ты утверждаешь чушь и не особо спешишь её обосновывать? Ну, это же не я написал "вот код в котором UB".И этоAnatoly Moskovskyи никакой массив тут и не требуется. Достаточно чтобы там, по вычисленному адресу, который разыменовывается, был валидный объектне ты писал? ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 14:33 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Anatoly MoskovskyНу, это же не я написал "вот код в котором UB". Придется доказывать тому кто написал. Пока не видно доказательства. Вместо этого видно, что утвержается что пол-языка это UB.Более того - хренова туча написанных на Си/C++ и работающих программ, по заверениям "гостя" работать не должна и не может! ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 14:34 |
|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_devAnatoly MoskovskyНу, это же не я написал "вот код в котором UB". Придется доказывать тому кто написал. Пока не видно доказательства. Вместо этого видно, что утвержается что пол-языка это UB.Более того - хренова туча написанных на Си/C++ и работающих программ, по заверениям "гостя" работать не должна и не может! Цитату сюда, где я утверждаю такое. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 14:36 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guest, так что, ответ на это: rdb_deva guestКак, если ты даже не умеешь читать? Покажи, с какого драфта ты скопировал то, что у тебя написано под спойлером.С какого драфта ты это цитировал, с того и взято. Я просто взял твою цитату драфта. будет? Или ты, таки, сам себя слил? ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 14:39 |
|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_deva guest, так что, ответ на это: rdb_devпропущено... С какого драфта ты это цитировал, с того и взято. Я просто взял твою цитату драфта. будет? Или ты, таки, сам себя слил?Смысл писать ответы, если ты не умеешь читать? Перечитай ещё раз, откуда бралась цитата и куда ты её приписал. Может, дойдёт после N-го перечитывания. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 14:41 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guestrdb_devпропущено... Более того - хренова туча написанных на Си/C++ и работающих программ, по заверениям "гостя" работать не должна и не может! Цитату сюда, где я утверждаю такое.Разве не ты здесь утверждаешь, что UB, это полный "ай-ай-ай" и что массив обязательно должен быть создан и инициализирован программой прежде, чем иметь к нему доступ. Может еще массив должен быть создан и инициализирован в той же самой единице компиляции, в одном потоке исполнения, чтобы программа могла "честно" получить к нему доступ? :) Бедные писатели драйверов и сервисов... "а мужики-то не знают!". Что уж говорить про тех, кто пользует mapped-memory файлы... ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 14:45 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guestСмысл писать ответы, если ты не умеешь читать? Перечитай ещё раз, откуда бралась цитата и куда ты её приписал. Может, дойдёт после N-го перечитывания.Еще раз для тех, кто в бронепоезде - это ТВОЯ цитата драфта, а не моя. :) Я лишь сделал copy-past и написал перевод. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 14:46 |
|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_deva guestСмысл писать ответы, если ты не умеешь читать? Перечитай ещё раз, откуда бралась цитата и куда ты её приписал. Может, дойдёт после N-го перечитывания.Еще раз для тех, кто в бронепоезде - это ТВОЯ цитата драфта, а не моя. :) Я лишь сделал copy-past и написал перевод. Перечитай ещё раз. Явно не дошло. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 14:51 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guest, так где в этом примере UB, дружище? Покажешь? Компилятор не ругается и собирает из команд процессора вполне ожидаемый и рабочий код... :) Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 14:54 |
|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_devКомпилятор не ругается и собирает из команд процессора вполне ожидаемый и рабочий код... :)1. И что из этого следует? 2. "ожидаемы" — ещё понятно. А что такое "рабочий"? Нет недопустимых инструкций? ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 14:59 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guest1. И что из этого следует? 2. "ожидаемы" — ещё понятно. А что такое "рабочий"? Нет недопустимых инструкций?Где в этом коде UB? :) ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 15:01 |
|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_deva guest1. И что из этого следует? 2. "ожидаемы" — ещё понятно. А что такое "рабочий"? Нет недопустимых инструкций?Где в этом коде UB?UB возникает во время выполнения и зависит от значений переменных. Хочешь продолжать обсуждение — пиши код без изъёбов. Я не собираюсь разбираться в ветках if-ов и смотреть, что там на какой итерации цикла будет. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 15:06 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guestrdb_devпропущено... Где в этом коде UB?UB возникает во время выполнения и зависит от значений переменных.И в чём же, во время выполнения, это UB выражается? :) ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 15:09 |
|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_deva guestпропущено... UB возникает во время выполнения и зависит от значений переменных.И в чём же, во время выполнения, это UB выражается? :)В чём угодно. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 15:19 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guestrdb_devИ в чём же, во время выполнения, это UB выражается? :)В чём угодно.Например? ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 15:24 |
|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_deva guestпропущено... UB возникает во время выполнения и зависит от значений переменных.И в чём же, во время выполнения, это UB выражается? :) Скомпилировал в QT. Запустил программу 2-а раза. Ищите отличия сами. (почему она не свалилась на GPF я не очень понимаю) В общем, вполне себе undefined бехевиар проявляется ))) ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 15:26 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guest BarloneС памятью, выделенной malloc, работать как с массивом вообще никак нельзя, да?Пока там не создан массив с помощью placement new — нельзя.Интересная точка зрения. И главное, я не могу найти в стандарте ее опровержения. А есть какие-нибудь обсуждения, комментарии по этому поводу (кроме этой темы)? ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 15:27 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Barlonea guestпропущено... Пока там не создан массив с помощью placement new — нельзя.Интересная точка зрения. И главное, я не могу найти в стандарте ее опровержения. А есть какие-нибудь обсуждения, комментарии по этому поводу (кроме этой темы)? https://groups.google.com/a/isocpp.org/d/msg/std-discussion/p4BXNhTHY7U/ahp5CzNFQQAJ ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 15:30 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Barlonea guestпропущено... Пока там не создан массив с помощью placement new — нельзя.Интересная точка зрения. И главное, я не могу найти в стандарте ее опровержения. А есть какие-нибудь обсуждения, комментарии по этому поводу (кроме этой темы)? http://wg21.link/p0593r2 ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 15:39 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Leonid KudryavtsevСкомпилировал в QT. Запустил программу 2-а раза. Ищите отличия сами. (почему она не свалилась на GPF я не очень понимаю) В общем, вполне себе undefined бехевиар проявляется )))Так а почему она должна была свалиться на GPF? Сколько потоку отводится на стек по умолчанию? 1МБ? :) Если сильно повезёт, то указатель не выскочит за пределы массива, а если не повезёт, будет выводить на экран символы за пределами кадра стека текущей функции (может даже выводить байты адресов возврата, сохраненных копий указателя стека и много другого). Крайне маловероятно, что при 100 итерациях мы выскочим вверх за пределы начала стека, получив исключение general protection failure или page fault. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 15:48 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guest, ну вот же есть в стандарте (Object lifetime): "The lifetime of an array object starts as soon as storage with proper size and alignment is obtained, and its lifetime ends when the storage which the array occupies is reused or released." ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 16:09 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Ну то есть как только у нас есть "storage with proper size and alignment", так мы сразу можем обращаться с ним как с массивом. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 16:11 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Barlonea guest, ну вот же есть в стандарте (Object lifetime): "The lifetime of an array object starts as soon as storage with proper size and alignment is obtained, and its lifetime ends when the storage which the array occupies is reused or released."Это отсюда http://eel.is/c draft/basic.life#1 ? ( "The lifetime of an object of type T begins when: storage with the proper alignment and size for type T is obtained") Созданию объекта с помощью definition или new expression ( http://eel.is/c draft/intro.object#def:object) предшествует выделение storage под этот объект. lifetime у достаточно тривиально конструируемых типов начинается сразу при выделении storage. Важно то, что выделение storage происходит в рамках definition объекта или new expression. Это неправильно понимать как то, что объекты сами собой заводятся в произвольном storage подходящего для них размера и выравнивания. Так многие думают (я тоже так когда-то интерпретировал это место), но тут это не имеется в виду. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 16:21 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Barlone, как же тогда быть с обычными Си строками на куче, те, что с завершающим нулём? Чтобы получить размер массива символов строки, нам нужно вызвать strlen, передав ей указатель на первый символ строки, а strlen, по заверениям некоторых товарищей, реализована с UB, так как строка не была создана как массив символов через new placement в недрах libstdc++ библиотеки - нельзя, ататашеньки! :) ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 16:23 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guestBarlonea guest, ну вот же есть в стандарте (Object lifetime): "The lifetime of an array object starts as soon as storage with proper size and alignment is obtained, and its lifetime ends when the storage which the array occupies is reused or released."Это отсюда http://eel.is/c draft/basic.life#1 ? ( "The lifetime of an object of type T begins when: storage with the proper alignment and size for type T is obtained") Созданию объекта с помощью definition или new expression ( http://eel.is/c draft/intro.object#def:object) предшествует выделение storage под этот объект. lifetime у достаточно тривиально конструируемых типов начинается сразу при выделении storage. Важно то, что выделение storage происходит в рамках definition объекта или new expression. Это неправильно понимать как то, что объекты сами собой заводятся в произвольном storage подходящего для них размера и выравнивания. Так многие думают (я тоже так когда-то интерпретировал это место), но тут это не имеется в виду.Объекты не заводятся, но массив - это не объект. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 16:31 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Как только выделили память, появился массив... но объектов в этом массиве нет, пока не вызвали placenent new ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 16:32 |
|
virtual methods
|
|||
---|---|---|---|
#18+
BarloneКак только выделили память, появился массив... но объектов в этом массиве нет, пока не вызвали placenent newТо есть я не имею права делать так?: Код: plaintext 1. 2. 3. 4. 5. 6.
Ведь это же сплошной, тотальный UB!!! :) ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 16:40 |
|
virtual methods
|
|||
---|---|---|---|
#18+
BarloneКак только выделили память, появился массив... но объектов в этом массиве нет, пока не вызвали placenent newИ что есть "объект" в понимании стандарта С++? ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 16:41 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Barloneмассив - это не объект.ШТО?! BarloneКак только выделили память, появился массив...Какого типа? ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 17:00 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Barlonea guestПока там не создан массив с помощью placement new — нельзя.Интересная точка зрения. И главное, я не могу найти в стандарте ее опровержения. А есть какие-нибудь обсуждения, комментарии по этому поводу (кроме этой темы)?Это потому, что очень многие никогда не читают "Введение" . ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2018, 04:58 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Barloneну вот же есть в стандарте (Object lifetime): "The lifetime of an array object startsЧерез 20 минут:Barloneмассив - это не объект. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2018, 09:22 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guest, тебе уже ответили, что есть элемент массива, а что есть объект, но ты привычно не читаешь. 21457288 Когда выражение, имеющее целочисленный тип прибавлено или вычтено из указателя, результат имеет тип операнда указателя. Если операнд указателя указывает на объект элемента массива и массив достаточно велик, результат указывает на смещение элемента от начального элемента так, что разница индексов результирующего и начального элемента массива является целочисленным выражением. Иными словами, если выражение P указывает на i-тый объект элемента массива, выражение (P)+N (в арифметике указателей тоже, что N+(P)) и (P)-N (где N имеет значение n) указывают, соответственно, на i+n-ый и i-n-ый объект элементов массива, если они существуют. Более того, если выражение P указывает на объект последнего элемента массива, выражение (P)+1 указывает следующий объект элемента массива после последнего и если выражение Q указывает на следующий за последним объектом элемента массива, выражение (Q)-1 указывает на последний объект элемента массива. Если оба, и операнд указателя, и результат также указывают на объект массива или на следующий за последним объект элемента массива, результатом оценки выражения не должно являться переполнение, в противном случае, поведение не определено. Если результат указывает на следующий за последним объект элемента массива, этот результат не должен быть использован в качестве операнда унарного оператора * (разыменование указателя). Примечание: Здесь под элементом массива понимается некая абстрактная единица хранения массива, имеющая размер хранящегося в ней объекта, а под объектом элемента понимается экземпляр любого типа, хранящийся в элементе массива, а не только экземпляр какого-либо класса. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2018, 09:39 |
|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_devBarloneпропущено... Интересная точка зрения. И главное, я не могу найти в стандарте ее опровержения. А есть какие-нибудь обсуждения, комментарии по этому поводу (кроме этой темы)?Это потому, что очень многие никогда не читают "Введение" .Введение — это не нормативная часть стандарта. (Читай: она ничего не значит) rdb_deva guest, тебе уже ответили, что есть элемент массива, а что есть объектГде? rdb_dev 21457288 Это из стандарта C. И это не определение массива или объекта. Это про адресную арифметику. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2018, 10:13 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guestrdb_devпропущено... Это потому, что очень многие никогда не читают "Введение" .Введение — это не нормативная часть стандарта. (Читай: она ничего не значит)По-твоему, это "ничего не значит"? :) C++ is a general purpose programming language based on the C programming language as described in ISO/IEC 9899:2011 Programming languages — C (hereinafter referred to as the C standard). C++ provides many facilities beyond those provided by C, including additional data types, classes, templates, exceptions, namespaces, operator overloading, function name overloading, references, free store management operators, and additional library facilities. Ну конечно, народ же это просто от балды написал! Ясно-понятно... a guestrdb_deva guest, тебе уже ответили, что есть элемент массива, а что есть объектГде?В той части женского тела, которая привычно рифмуется с вопросом "Где?"! :) Глаза разуй! a guestrdb_dev 21457288 Это из стандарта C. И это не определение массива или объекта. Это про адресную арифметику.Конечно! Что же еще? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2018, 10:39 |
|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_deva guestпропущено... Введение — это не нормативная часть стандарта. (Читай: она ничего не значит)По-твоему, это "ничего не значит"?Не по моему, а по правилам написания стандартов ISO. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2018, 10:46 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guestrdb_devПо-твоему, это "ничего не значит"?Не по моему, а по правилам написания стандартов ISO.Ok! Правила в студию! А это тебе почитать на досуге про индексы массивов и арифметику указателей . ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2018, 10:47 |
|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_deva guestпропущено... Не по моему, а по правилам написания стандартов ISO.Ok! Правила в студию!Тот кто утверждает чушь и должен работать доказывая свои утверждения. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2018, 10:52 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guest, давай-ка почитаем перевод, идеально сделанный yandex переводчиком без каких-либо моих правок, чтоб тебе было понятней, что там написано. ОригиналC++ is a general purpose programming language based on the C programming language as described in ISO/IEC 9899:2011 Programming languages — C (hereinafter referred to as the C standard). C++ provides many facilities beyond those provided by C, including additional data types, classes, templates, exceptions, namespaces, operator overloading, function name overloading, references, free store management operators, and additional library facilities. ПереводC++ - это язык программирования общего назначения, основанный на языке программирования C, как описано в ISO/IEC 9899:2011 Programming languages — C (далее-стандарт C). C++ предоставляет множество возможностей, помимо предоставляемых C, включая дополнительные типы данных, классы, шаблоны, исключения, пространства имен, перегрузку операторов, перегрузку имен функций, ссылки, операторы управления свободными хранилищами и дополнительные библиотечные средства. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2018, 10:56 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guestrdb_deva guestrdb_devПо-твоему, это "ничего не значит"?Не по моему, а по правилам написания стандартов ISO.Ok! Правила в студию!Тот кто утверждает чушь и должен работать доказывая свои утверждения.Так ты и утверждаешь тут какую-то чушь про правила написания стандартов. Утверждаешь - доказывай! ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2018, 11:00 |
|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_deva guestпропущено... Тот кто утверждает чушь и должен работать доказывая свои утверждения.Так ты и утверждаешь тут какую-то чушь про правила написания стандартов.Нет, это не чушь, а чистая правда. Раз я не утверждаю чушь, то и доказывать не должен. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2018, 11:04 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guestrdb_devпропущено... Так ты и утверждаешь тут какую-то чушь про правила написания стандартов.Нет, это не чушь, а чистая правда. Раз я не утверждаю чушь, то и доказывать не должен.Ну так и доказывай, что это "чистая правда" - приведи ссылку на тот фрагмент правил написания стандартов ISO где утверждается, то, что ты тут нам пересказываешь! :) ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2018, 11:13 |
|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_deva guestпропущено... Нет, это не чушь, а чистая правда. Раз я не утверждаю чушь, то и доказывать не должен.Ну так и доказывай, что это "чистая правда"Это ты меня пытаешься в чём-то убедить (что в C++ действительно всё то, что действительно в C, т.к. C++ наследуется от C или вроде того). Ну вот и доказывай, что Введение к чему-то обязывает. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2018, 11:24 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guestrdb_devНу так и доказывай, что это "чистая правда"Это ты меня пытаешься в чём-то убедить (что в C++ действительно всё то, что действительно в C, т.к. C++ наследуется от C или вроде того). Ну вот и доказывай, что Введение к чему-то обязывает.Неа! :) Я просто хочу увидеть ссылку на тот фрагмент официальных правил написания стандартов ISO где утверждается, то, что ты тут нам пересказываешь! ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2018, 11:32 |
|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_deva guestпропущено... Это ты меня пытаешься в чём-то убедить (что в C++ действительно всё то, что действительно в C, т.к. C++ наследуется от C или вроде того). Ну вот и доказывай, что Введение к чему-то обязывает.Неа! :) Я просто хочу увидеть ссылку на тот фрагмент официальных правил написания стандартов ISO где утверждается, то, что ты тут нам пересказываешь!И кто тебе мешает? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2018, 11:40 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guestrdb_devНеа! :) Я просто хочу увидеть ссылку на тот фрагмент официальных правил написания стандартов ISO где утверждается, то, что ты тут нам пересказываешь!И кто тебе мешает?Твой "Чайник Рассела", очевидно же! Бремя доказательства лежит на утверждающем. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2018, 12:08 |
|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_deva guestпропущено... И кто тебе мешает?Твой "Чайник Рассела", очевидно же! Бремя доказательства лежит на утверждающем.Это ты пытаешься тут доказать про действие правил из C в C++. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2018, 12:30 |
|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_deva guestпропущено... Это ты пытаешься тут доказать про действие правил из C в C++.Мне не надо ничего доказывать! За меня это сделало "Введение в стандарт C++" 21460144 .Там даже не написано такого (что правила действуют). Написано, что C++ "based" на C. Что это "based" означает? Java тоже based на C и C++. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2018, 13:09 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guestТам даже не написано такого (что правила действуют). Написано, что C++ "based" на C. Что это "based" означает? Java тоже based на C и C++.Перечитывай до просветления, может излечишься! "C++ - это язык программирования общего назначения, основанный на языке программирования C, как описано в ISO/IEC 9899:2011 Programming languages — C (далее-стандарт C). C++ предоставляет множество возможностей, помимо предоставляемых C, включая дополнительные типы данных, классы, шаблоны, исключения, пространства имен, перегрузку операторов, перегрузку имен функций, ссылки, операторы управления свободными хранилищами и дополнительные библиотечные средства." ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2018, 13:12 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guestНаписано, что C++ "based" на C. Что это "based" означает? Java тоже based на C и C++.В каком месте спецификации Java написана подобная бредятина? Можно ссылочку? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2018, 13:13 |
|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_deva guestТам даже не написано такого (что правила действуют). Написано, что C++ "based" на C. Что это "based" означает? Java тоже based на C и C++.Перечитывай до просветления, может излечишься! "C++ - это язык программирования общего назначения, основанный на языке программирования C, как описано в ISO/IEC 9899:2011 Programming languages — C (далее-стандарт C). C++ предоставляет множество возможностей, помимо предоставляемых C, включая дополнительные типы данных, классы, шаблоны, исключения, пространства имен, перегрузку операторов, перегрузку имен функций, ссылки, операторы управления свободными хранилищами и дополнительные библиотечные средства." А почему тогда, например, variable length arrays в C++ не разрешены? Они разрешены в C, на котором C++ based (что, якобы, должно означать, что всё, что верно в C — верно и в C++). ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2018, 13:14 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guestА почему тогда, например, variable length arrays в C++ не разрешены? Они разрешены в C, на котором C++ based (что, якобы, должно означать, что всё, что верно в C — верно и в C++).С какого перепугу? :) Код: plaintext 1. 2. 3. 4. 5. 6. 7.
... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2018, 13:28 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Anatoly MoskovskyЯ вообще не понимаю, какая джава головного мозга должна быть в голове человека, предположившего, что работа с памятью через приведенный указатель в С/С++ это UB (т.е. то без чего С/С++ нафик не нужен еще и не работает). Тут не стандарт надо обсуждать, а куда его направить лечиться )) но в целом-то он прав. Лично я, всю жизнь думал, что арифметика над указателями описывается просто как pointer + sizeof( type ). Но драфт на который была ссылка (ровно как и MSDN) арифметику над указателями описывает __исключительно__ как навигацию в массиве (при этом исключительно в приделах массива, с исключением для элемента следующего за самым последним). Т.ч. в данном случае "java головного мозга" у тех, кто пишет драфты пытаясь из C сделать нечто java-ООП-универсально-образное. В общем-то, "работа с памятью через приведенный указатель не к исходному типу", явно платформенно зависимое решение, которое может работать, а может и нет. То, что char и int все же формально разные типы данных, надеюсь никто спорить не будет. IMHO & AFAIK P.S. Топик получился феерический. Вроде начался с одного невинного идиотского вопроса, а уже 13 страниц все друг в друга какашки кидают. На мой взгляд, топик нужно занести в аналы истории, где-то рядом с темой "бритье подмышек" из fido конференции ))) ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2018, 13:37 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guestЯ вижу ты совсем нулевой... https://wandbox.org/permlink/SrXdy1eWXerw4BGL Код: plaintext 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2018, 13:39 |
|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_deva guestЯ вижу ты совсем нулевой... https://wandbox.org/permlink/SrXdy1eWXerw4BGL Код: plaintext 1. 2.
Передай своему свежему g++ флаг -pedantic-errors ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2018, 13:45 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Leonid KudryavtsevЛично я, всю жизнь думал, что арифметика над указателями описывается просто как pointer + sizeof( type ).Ты неправильно думал! То, о чем ты думал, отсутствует также и в Си. Арифметика указателей всегда учитывает размер типа данных на экземпляры которых ссылается указатель. Если указатель указывает на double, то (P)+1 указывает на следующий double, а не на более старший байт (для little-endian) или более младший (для big-endian) байт того же самого double. Leonid KudryavtsevНо драфт на который была ссылка (ровно как и MSDN) арифметику над указателями описывает __исключительно__ как навигацию в массиве (при этом исключительно в приделах массива, с исключением для элемента следующего за самым последним). Т.ч. в данном случае "java головного мозга" у тех, кто пишет драфты пытаясь из C сделать нечто java-ООП-универсально-образное.Вот что об этом написано в стандарте C++ . Ничем не отличается от Си. Leonid KudryavtsevВ общем-то, "работа с памятью через приведенный указатель не к исходному типу", явно платформенно зависимое решение, которое может работать, а может и нет.Тут ты тоже ошибаешься. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2018, 13:59 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guestПередай своему свежему g++ флаг -pedantic-errorsПередал, ничего не поменялось! :) ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2018, 14:05 |
|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_deva guestПередай своему свежему g++ флаг -pedantic-errorsПередал, ничего не поменялось! :)А нет, пардон! Поменялось. Ну и зачем мне выставлять этот флаг? :) ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2018, 14:08 |
|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_devrdb_devпропущено... Передал, ничего не поменялось! :)А нет, пардон! Поменялось. Ну и зачем мне выставлять этот флаг? :)Чтобы отключить нестандартные расширения. VLA — это расширение g++. VLA не разрешены стандартом. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2018, 14:10 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guestrdb_devпропущено... А нет, пардон! Поменялось. Ну и зачем мне выставлять этот флаг? :)Чтобы отключить нестандартные расширения. VLA — это расширение g++. VLA не разрешены стандартом.Кто тебе сказал, что это поведение "нестандартное"? :) Тебе же гнусы чёрным по белому написали: "Variable-length automatic arrays are allowed in ISO C99, and as an extension GCC accepts them in C90 mode and in C++." Надеюсь, тебе не надо объяснять, что означают сокращения C99 и C90 ? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2018, 14:16 |
|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_deva guestпропущено... Чтобы отключить нестандартные расширения. VLA — это расширение g++. VLA не разрешены стандартом.Кто тебе сказал, что это поведение "нестандартное"? :) Тебе же гнусы чёрным по белому написали: "Variable-length automatic arrays are allowed in ISO C99, and as an extension GCC accepts them in C90 mode and in C++." Надеюсь, тебе не надо объяснять, что означают сокращения C99 и C90 ?Ты не отличаешь C99 от C++? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2018, 14:18 |
|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_deva guestпропущено... Чтобы отключить нестандартные расширения. VLA — это расширение g++. VLA не разрешены стандартом.Кто тебе сказал, что это поведение "нестандартное"? :) Тебе же гнусы чёрным по белому написали: "error: ISO C++ forbids variable length array". ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2018, 14:21 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guestrdb_devпропущено... Кто тебе сказал, что это поведение "нестандартное"? :) Тебе же гнусы чёрным по белому написали: "error: ISO C++ forbids variable length array". Это означает лишь одно - в стандарте C++ явно оговорили данное отличие от наследуемого Си. Что тебя, опять, не устраивает? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2018, 14:31 |
|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_dev....Арифметика указателей всегда учитывает размер типа данных на экземпляры которых ссылается указатель..... Об этом я знаю ))) sizeof(type) я и написал. Но draf то опысывает как раз по другому. Не "учитывается размер", а то, что будет выбран корректный элемент в массиве. Т.е. ограничивает всю "арифметику" исключительно перемещением по массиву (при этом, еще и с запретом выхода за пределы массива) ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2018, 14:36 |
|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_deva guestпропущено... "error: ISO C++ forbids variable length array". Это означает лишь одно - в стандарте C++ явно оговорили данное отличие от наследуемого Си. Ты вроде был за то, что VLA разрешены. Allowed красным выделял. В каком разделе стандарта C++ явно оговорено данное отличие? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2018, 14:39 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guestrdb_devпропущено... Это означает лишь одно - в стандарте C++ явно оговорили данное отличие от наследуемого Си. Ты вроде был за то, что VLA разрешены. Allowed красным выделял. В каком разделе стандарта C++ явно оговорено данное отличие?Тебе гнусы написали, что VLA разрешены в C90 режиме компилятора g++. Чего тебе еще? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2018, 14:42 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsevно в целом-то он прав. Лично я, всю жизнь думал, что арифметика над указателями описывается просто как pointer + sizeof( type ). Но драфт на который была ссылка (ровно как и MSDN) арифметику над указателями описывает __исключительно__ как навигацию в массиве (при этом исключительно в приделах массива, с исключением для элемента следующего за самым последним). Кусок памяти и ссылка (в широком смысле: имя, указатель, ссылка) на него с информацией о типе, это и есть объект, в том числе массив, если тип - массив. Абсолютно не важно какие там конструкторы и в каком порядке вызывались. От этого массив не перестает быть массивом. Если конструктор не вызван, то объект просто неинициализированный, обращение к его содержимому - UB. Если нет такого обращения, то никакого UB нет. Нет никакого правила, что все элементы массива должны быть инициализированы при создании массива, а иначе это не массив. Поэтому, если есть кусок памяти в котором может находиться массив заданного размера, и есть указатель на массив, то с точки зрения юзера этого указателя - это и есть массив, и дальше к этому и применяются вышеприведенные правила про то что нельзя обращаться за пределы массива, или нельзя обращаться элементам не инициализировав их. Все остальный фантазии прозвучавшие в этом топике про то что "массива нет" - бред сивой кобылы. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2018, 14:44 |
|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_deva guestпропущено... Ты вроде был за то, что VLA разрешены. Allowed красным выделял. В каком разделе стандарта C++ явно оговорено данное отличие?Тебе гнусы написали, что VLA разрешены в C90 режиме компилятора g++.Ты совсем недавно писал, что C это часть стандарта C++ и поэтому в C++ разрешены VLA. Даже демонстрировал код, который якобы должен был это подтвердить. rdb_devЧего тебе еще?Покажи, где стандарт C++ явно оговорил запрет VLA. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2018, 14:48 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guestrdb_devЧего тебе еще?Покажи, где стандарт C++ явно оговорил запрет VLA.Не знаю... Может ты мне подскажешь, в каком месте стандарта C++ указано что VLA - forbids? Компилятор g++, без дурацких параметров командной строки собирает и не жужжит... ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2018, 14:50 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Leonid KudryavtsevНо draf то опысывает как раз по другому. Не "учитывается размер", а то, что будет выбран корректный элемент в массиве. Т.е. ограничивает всю "арифметику" исключительно перемещением по массиву (при этом, еще и с запретом выхода за пределы массива)Ничего подобного! http://eel.is/c++draft/expr.post#expr.sub]The expression E1[E2] is identical (by definition) to *((E1)+(E2)), except that in the case of an array operand, the result is an lvalue if that operand is an lvalue and an xvalue otherwise. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2018, 14:53 |
|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_devrdb_devпропущено... Это означает лишь одно - в стандарте C++ явно оговорили данное отличие от наследуемого Си. Что тебя, опять, не устраивает? Не знаю... Может ты мне подскажешь, в каком месте стандарта C++ указано что VLA - forbids?Прям явно — нигде такого не написано. По крайней мере я не находил такого. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2018, 15:13 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guestrdb_devНе знаю... Может ты мне подскажешь, в каком месте стандарта C++ указано что VLA - forbids?Прям явно — нигде такого не написано. По крайней мере я не находил такого.Удивляешь ты меня раз за разом... 11.3.4 ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2018, 15:15 |
|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_deva guestпропущено... Прям явно — нигде такого не написано. По крайней мере я не находил такого.Удивляешь ты меня раз за разом... 11.3.4 Ты понимаешь слово "явно"? Неявно оно следует из ограничения на выражение, задающее размер. Которое должно быть константным. "Явно" — это если бы в http://eel.is/c draft/diff.iso (This subclause lists the differences between C++ and ISO C) явно написали, что VLA в C++ нет, хотя они есть в C. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2018, 15:20 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guestТы понимаешь слово "явно"? Неявно оно следует из ограничения на выражение, задающее размер. Которое должно быть константным. "Явно" — это если бы в http://eel.is/c draft/diff.iso (This subclause lists the differences between C++ and ISO C) явно написали, что VLA в C++ нет, хотя они есть в C.То есть D1 [constant-expression] attribute-specifier-seq это недостаточно явно, ага? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2018, 15:23 |
|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_deva guestТы понимаешь слово "явно"? Неявно оно следует из ограничения на выражение, задающее размер. Которое должно быть константным. "Явно" — это если бы в http://eel.is/c draft/diff.iso (This subclause lists the differences between C++ and ISO C) явно написали, что VLA в C++ нет, хотя они есть в C.То есть D1 [constant-expression] attribute-specifier-seq это недостаточно явно, ага?То есть An object is created by a definition ([basic.def]), by a new-expression, when implicitly changing the active member of a union ([class.union]), or when a temporary object is created ([conv.rval], [class.temporary]) это недостаточно явно говорит о том, что malloc не создаёт объекты и что массивы не самозарождаются? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2018, 15:27 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Что-то раздухарились вы на 14 страниц... Там есть что-то интересное? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2018, 15:59 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Уже нет. Даже лагеря сохраняют состав. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2018, 16:17 |
|
virtual methods
|
|||
---|---|---|---|
#18+
MasterZivЧто-то раздухарились вы на 14 страниц... Там есть что-то интересное?вечером под попкорн можно почитать )) ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2018, 23:50 |
|
virtual methods
|
|||
---|---|---|---|
#18+
MasterZiv, свист банхаммера ласкает ухо. Заржавел поди твой инструмент? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.06.2018, 01:21 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guestэто недостаточно явно говорит о том, что malloc не создаёт объекты и что массивы не самозарождаются?Библиотечная функция malloc и в Си никогда не создавала объекты...Её задача - выделение из кучи участка запрошенного размера. Не больше, не меньше. Массив переменной длины на стеке. Код без проблем компилируется с флагом -pedantic-errors Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
... |
|||
:
Нравится:
Не нравится:
|
|||
02.06.2018, 21:06 |
|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_deva guestэто недостаточно явно говорит о том, что malloc не создаёт объекты и что массивы не самозарождаются?Библиотечная функция malloc и в Си никогда не создавала объекты...Её задача - выделение из кучи участка запрошенного размера. Не больше, не меньше. Массив переменной длины на стеке.Тут нет массива. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.06.2018, 23:01 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guestТут нет массива.И с чего ты это взял? Тебе же в стандарте явно указано: The expression E1[E2] is identical (by definition) to *((E1)+(E2)) ... |
|||
:
Нравится:
Не нравится:
|
|||
02.06.2018, 23:06 |
|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_deva guestТут нет массива.И с чего ты это взял?С того, что его там нет. rdb_devТебе же в стандарте явно указано: The expression E1[E2] is identical (by definition) to *((E1)+(E2)) Ну и? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.06.2018, 23:10 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guestНу и? Если элемент массива эквивалентен типизированному указателю, то функция, возвращающая некую область памяти затребованного размера по нетипизированному указателю уже является неинициализированным массивом объектов элементов массива того типа указателя, через который, в конечном итоге, будет осуществляться доступ к этой области памяти. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.06.2018, 23:15 |
|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_deva guestНу и?Ну и включи логику и сделай выводы! Если элемент массива эквивалентен типизированному указателю, то функция, возвращающая некую область памяти затребованного размера по нетипизированному указателю уже является неинициализированным массивом объектов элементов массива того типа указателя, через который, в конечном итоге, будет осуществляться доступ к этой области памяти.Только вот элемент массива не эквивалентен типизированному указателю. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.06.2018, 23:20 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guestТолько вот элемент массива не эквивалентен типизированному указателю.Еще раз: http://eel.is/c++draft/expr.post#expr.sub]The expression E1[E2] is identical (by definition) to *((E1)+(E2)) ... |
|||
:
Нравится:
Не нравится:
|
|||
02.06.2018, 23:41 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Друзья! Убедительная просьба - обсуждать тему а не собеседника. Учитесь быть деликатными. Попробуйте. У вас получится. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.06.2018, 23:46 |
|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_deva guestТолько вот элемент массива не эквивалентен типизированному указателю.Еще раз: http://eel.is/c++draft/expr.post#expr.sub]The expression E1[E2] is identical (by definition) to *((E1)+(E2)) Ещё раз: ну и? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.06.2018, 23:47 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guestЕщё раз: ну и? http://eel.is/c++draft/expr.post#expr.sub] The expression E1[E2] is identical (by definition) to *((E1)+(E2)) ... |
|||
:
Нравится:
Не нравится:
|
|||
03.06.2018, 00:07 |
|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_deva guestЕщё раз: ну и? http://eel.is/c++draft/expr.post#expr.sub] The expression E1[E2] is identical (by definition) to *((E1)+(E2)) Ну и? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.06.2018, 00:12 |
|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_dev, a guest, У вас deadlock ... |
|||
:
Нравится:
Не нравится:
|
|||
03.06.2018, 00:19 |
|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_deva guest, 21463609 В том, на чём тебя заело, не написано про эквивалентность элемента массива указателю. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.06.2018, 00:31 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guestВ том, на чём тебя заело, не написано про эквивалентность элемента массива указателю.тогда поясни, что, по-твоему, там написано. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.06.2018, 00:32 |
|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_deva guestВ том, на чём тебя заело, не написано про эквивалентность элемента массива указателю.тогда поясни, что, по-твоему, там написано.Там написано, что выражение E1[E2] эквивалентно (по определению) выражению *((E1)+(E2)). (За некоторыми исключениями, которые потерялись.) Тебе не ясно, что значит "эквивалентно по определению"? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.06.2018, 00:45 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guest, мне-то абсолютно ясно, что значит "эквивалентно (по определению) выражению *((E1)+(E2))", наверное потому, что я хорошо понимаю смысл записи: *((E1)+(E2)) ... |
|||
:
Нравится:
Не нравится:
|
|||
03.06.2018, 01:12 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Предлагаю всем великим знатокам грамматики пройти и посмотреть, как сейчас выглядит http://eel.is/c draft/expr.add#4 : When an expression J that has integral type is added to or subtracted from an expression P of pointer type, the result has the type of P. — If P evaluates to a null pointer value and J evaluates to 0, the result is a null pointer value. — Otherwise, if P points to element x[i] of an array object x with n elements,82 the expressions P + J and J + P (where J has the value j) point to the (possibly-hypothetical) element x[i+j] if 0≤i+j≤n and the expression P - J points to the (possibly-hypothetical) element x[i−j] if 0≤i−j≤n. — Otherwise, the behavior is undefined. По-прежнему будете бредить, что последний "Otherwise" относится только к "if 0≤i−j≤n", а не обоим предыдущим пунктам? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.12.2018, 01:17 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guest, и что это меняет? Ты сам-то хорошо разобрался в том, что написано и внимательно ли ты с самого начала читал стандарт? http://eel.is/c draft/intro.defs#defns.access ... |
|||
:
Нравится:
Не нравится:
|
|||
17.12.2018, 15:26 |
|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_deva guest, и что это меняет?Формально это ничего не меняет, просто переформатировали параграф и перенесли пункт, разрешающий прибавлять к нулевому указателю 0 повыше, так, чтобы это не противоречило тому, что в одном месте говорят, что "...; иначе UB", а через пару параграфов есть иначе, которое не UB. Параграф, разрешающий добавлять 0 к нулевому указателю ввели в C++, в C его нет, и забыли обновить параграф, оставшийся от C. Просто теперь ещё более явно видно, к чему относится otherwise. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.12.2018, 22:23 |
|
|
start [/forum/topic.php?all=1&fid=57&tid=2017692]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
37ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
242ms |
get tp. blocked users: |
2ms |
others: | 263ms |
total: | 589ms |
0 / 0 |