|
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 |
|
|
start [/forum/topic.php?fid=57&msg=39653812&tid=2017692]: |
0ms |
get settings: |
8ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
4ms |
track hit: |
34ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
57ms |
get tp. blocked users: |
1ms |
others: | 255ms |
total: | 388ms |
0 / 0 |