Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Ручное назначение номеров индексов массива
|
|||
|---|---|---|---|
|
#18+
К примеру, есть массив int numbers[4], он состоит из элементов: numbers[0]; numbers[1]; numbers[2]; numbers[3]; Можно ли переназначить индекс элементов, чтобы массив int numbers[4] состоял из элементов: numbers[2000]; numbers[2001]; numbers[2002]; numbers[2003]. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2016, 19:28 |
|
||
|
Ручное назначение номеров индексов массива
|
|||
|---|---|---|---|
|
#18+
ukugyul552465Можно ли Можно: объяви массив классом, переопредели операцию [] и там можешь спокойно вычитать из индекса свои 2000. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2016, 19:39 |
|
||
|
Ручное назначение номеров индексов массива
|
|||
|---|---|---|---|
|
#18+
Да проще наверное сделать минус 2000. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2016, 19:41 |
|
||
|
Ручное назначение номеров индексов массива
|
|||
|---|---|---|---|
|
#18+
Это уже map какой-то получается, вот только последовательного расположения данных в памяти не будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2016, 20:09 |
|
||
|
Ручное назначение номеров индексов массива
|
|||
|---|---|---|---|
|
#18+
В паскале это работает из коробки. Я могу щас ошибаться в синтаксисе но где-то так Код: pascal 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2016, 22:02 |
|
||
|
Ручное назначение номеров индексов массива
|
|||
|---|---|---|---|
|
#18+
maytonВ паскале это работает из коробки. Я могу щас ошибаться в синтаксисе но где-то так Код: pascal 1. 2. даже в Бейсике не к ночи будь помянут ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2016, 22:07 |
|
||
|
Ручное назначение номеров индексов массива
|
|||
|---|---|---|---|
|
#18+
ukugyul552465К примеру, есть массив int numbers[4], он состоит из элементов: numbers[0]; numbers[1]; numbers[2]; numbers[3]; Можно ли переназначить индекс элементов, чтобы массив int numbers[4] состоял из элементов: numbers[2000]; numbers[2001]; numbers[2002]; numbers[2003]. можно. только нахрена? чета времена у нас пошли суровые, один 25 тыщ потоков для опроса DNS создает, другой элементы массива с 2000 хочет нумеровать... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2016, 23:26 |
|
||
|
Ручное назначение номеров индексов массива
|
|||
|---|---|---|---|
|
#18+
Автору поможет Стебелек, который как известно работает опережая релятивистские скорости распространения электрического-поля в металлах. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2016, 10:56 |
|
||
|
Ручное назначение номеров индексов массива
|
|||
|---|---|---|---|
|
#18+
ukugyul552465, Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Вывод: Код: plaintext 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2016, 11:44 |
|
||
|
Ручное назначение номеров индексов массива
|
|||
|---|---|---|---|
|
#18+
Usman, ага главное не забыть потом сделать undefine ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2016, 12:22 |
|
||
|
Ручное назначение номеров индексов массива
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2016, 12:36 |
|
||
|
Ручное назначение номеров индексов массива
|
|||
|---|---|---|---|
|
#18+
ukugyul552465К примеру, есть массив int numbers[4], он состоит из элементов: numbers[0]; numbers[1]; numbers[2]; numbers[3]; Можно ли переназначить индекс элементов, чтобы массив int numbers[4] состоял из элементов: numbers[2000]; numbers[2001]; numbers[2002]; numbers[2003]. Можно попробовать выстрелить себе в ногу Код: plaintext 1. 2. 3. 4. 5. но нужно ли? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2016, 11:05 |
|
||
|
Ручное назначение номеров индексов массива
|
|||
|---|---|---|---|
|
#18+
BagaBaga, nice shot! Мне нравится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2016, 11:07 |
|
||
|
Ручное назначение номеров индексов массива
|
|||
|---|---|---|---|
|
#18+
mayton, так это старый трюк, я думал, уж это-то все знают... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2016, 19:16 |
|
||
|
Ручное назначение номеров индексов массива
|
|||
|---|---|---|---|
|
#18+
MasterZiv, абсолютно согласен - старый добрый С-style трюк. То ли народ подзабывать стал, то ли молодёжь подрастает ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2016, 23:23 |
|
||
|
Ручное назначение номеров индексов массива
|
|||
|---|---|---|---|
|
#18+
BagaBagaukugyul552465К примеру, есть массив int numbers[4], он состоит из элементов: numbers[0]; numbers[1]; numbers[2]; numbers[3]; Можно ли переназначить индекс элементов, чтобы массив int numbers[4] состоял из элементов: numbers[2000]; numbers[2001]; numbers[2002]; numbers[2003]. Можно попробовать выстрелить себе в ногу Код: plaintext 1. 2. 3. 4. 5. но нужно ли? И зачем так пробовать? Разве в данном случае мы не имеем ub? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2016, 15:40 |
|
||
|
Ручное назначение номеров индексов массива
|
|||
|---|---|---|---|
|
#18+
SashaMercury, индексация — просто сахар для сложения с последующим разыменованием, какое тут UB? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2016, 15:57 |
|
||
|
Ручное назначение номеров индексов массива
|
|||
|---|---|---|---|
|
#18+
RWolfиндексация — просто сахар для сложения с последующим разыменованием, какое тут UB? прямейшее. Код: plaintext 1. может просто не исполниться на ряде архитектур Например на 80286 в защищённом режиме ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2016, 16:25 |
|
||
|
Ручное назначение номеров индексов массива
|
|||
|---|---|---|---|
|
#18+
Изопропил, это то же, что Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2016, 16:26 |
|
||
|
Ручное назначение номеров индексов массива
|
|||
|---|---|---|---|
|
#18+
А всегда-ли выпрыгивание за границы аррея это ошибка? ЕМНИП в каких-то языках (толи PHP толи Пайтон) можно было "кружить кругами" по массиву если индекс был за границей. По сути MOD (n). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2016, 16:30 |
|
||
|
Ручное назначение номеров индексов массива
|
|||
|---|---|---|---|
|
#18+
maytonА всегда-ли выпрыгивание за границы аррея это ошибка? достаточно того, что это может быть ошибкой. например в том же защищённом 286 эта операция может привести к записи в сегментый регистр невалидного дескриптора со всеми последствиями. и чем дальше архитектура от PDP/11 - тем веселее ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2016, 16:39 |
|
||
|
Ручное назначение номеров индексов массива
|
|||
|---|---|---|---|
|
#18+
Изопропил, разве арифметика с указателем затрагивает сегментные регистры? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2016, 16:44 |
|
||
|
Ручное назначение номеров индексов массива
|
|||
|---|---|---|---|
|
#18+
RWolfИзопропил, разве арифметика с указателем затрагивает сегментные регистры? легко затронет, если массив имеет длину более 64КБайт ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2016, 16:47 |
|
||
|
Ручное назначение номеров индексов массива
|
|||
|---|---|---|---|
|
#18+
RWolfSashaMercury, индексация — просто сахар для сложения с последующим разыменованием, какое тут UB? В данном случае необходимо сделать отсылку к последней версии стандарта (у меня есть черновик, ссылку на который всем предоставил Анатолий, совсем недавно), в частности к разделу 5.7 Additive operators С++ 17 N4594 5.7.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 pointer operand points to an element of an array object84, 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 integral 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2016, 17:13 |
|
||
|
Ручное назначение номеров индексов массива
|
|||
|---|---|---|---|
|
#18+
SashaMercury, то есть, адресная арифметика определена только в пределах выделенной памяти; ну, видимо, на это были какие-то причины. Изопропил, хм, как-то не попадались мне такие модели памяти, в которых инкремент указателя может повалить программу. Глянуть бы листинг для иллюстрации. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2016, 17:47 |
|
||
|
Ручное назначение номеров индексов массива
|
|||
|---|---|---|---|
|
#18+
SashaMercuryBagaBagaпропущено... Можно попробовать выстрелить себе в ногу Код: plaintext 1. 2. 3. 4. 5. но нужно ли? И зачем так пробовать? Разве в данном случае мы не имеем ub? Там же сказано - выстрелить себе в ногу :) Это классический (можно сказать - бородатый) трюк со времен С. И да, это UB, если следовать букве стандарта. По стандарту, если вы уж получили непрерывные кусок памяти (в т.ч. массив), то вся ваша адресная арифметика должна уложиться "внутрь" выделенного непрерывного диапазона адресов. Например, вот такой код Код: plaintext 1. 2. 3. 4. 5. тоже UB в чистом виде. Этот UB можно наглядно словить, если вы "захотите обработать" больше сегмента. Или если вдруг "разность" должна стать отрицательным числом... Что тогда будет, ведь отрицательных адресов не бывает? (подсказка - скорее всего "улетите" в чужой сегмент). Но к несчастью, в большинстве случаев на x86 этот UB работает так, как ожидается ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2016, 23:19 |
|
||
|
Ручное назначение номеров индексов массива
|
|||
|---|---|---|---|
|
#18+
BagaBaga Это классический (можно сказать - бородатый) трюк со времен С. Может быть (хотя трюки должны быть законными). Было бы интересно увидеть где этот "трюк" встречается (увидеть отсылку времен K&R к такому примеру) и как его комментируют авторы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2016, 10:28 |
|
||
|
Ручное назначение номеров индексов массива
|
|||
|---|---|---|---|
|
#18+
SashaMercuryBagaBaga Это классический (можно сказать - бородатый) трюк со времен С. Может быть (хотя трюки должны быть законными). Было бы интересно увидеть где этот "трюк" встречается (увидеть отсылку времен K&R к такому примеру) и как его комментируют авторы SashaMercury, ты не поверишь, но трюки никому ничего не должны :) Более того, большинство из них по определению UB. Ну вот взять хоть те же трюки по доступу к закрытым полям класса. Как их сделать без UB? Никак :) Во времена K&R, на сколько я знаю, интернета не было. Так что дать ссылку на первоисточник вряд ли можно. Этот трюк встречался в разных кодах, но популяризировали его, скорее всего, авторы книги Numerical Recipes in C. В новых переизданиях этот трюк убрали как не совсем соответсвующий стандарту. PS Да, к стати, никого не смущает, что итератор end() указывает _ЗА_ последний элемент? Похоже, что именно для этой практики в адресной арифметике в стандарте сделано исключение - можно получать (про разъыменовывать - ни ни) адрес, на один элемент больший, чем последний адрес выделенной непрерывной области. Иначе пришлось бы "закопать" весь STL :)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2016, 14:59 |
|
||
|
Ручное назначение номеров индексов массива
|
|||
|---|---|---|---|
|
#18+
BagaBagaSashaMercuryпропущено... Может быть (хотя трюки должны быть законными). Было бы интересно увидеть где этот "трюк" встречается (увидеть отсылку времен K&R к такому примеру) и как его комментируют авторы SashaMercury, ты не поверишь, но трюки никому ничего не должны :) Более того, большинство из них по определению UB. Ну вот взять хоть те же трюки по доступу к закрытым полям класса. Как их сделать без UB? Никак :) У нас с вами разные определения для этого слова. На мой взгляд трюк это что-то законное, но не явное. BagaBagaВо времена K&R, на сколько я знаю, интернета не было. Так что дать ссылку на первоисточник вряд ли можно. Этот трюк встречался в разных кодах, но популяризировали его, скорее всего, авторы книги Numerical Recipes in C. В новых переизданиях этот трюк убрали как не совсем соответсвующий стандарту. Вы выше писали про то, что трюки не обязаны соответствовать стандарту, более того, по определению ub BagaBagaPS Да, к стати, никого не смущает, что итератор end() указывает _ЗА_ последний элемент? Похоже, что именно для этой практики в адресной арифметике в стандарте сделано исключение - можно получать (про разъыменовывать - ни ни) адрес, на один элемент больший, чем последний адрес выделенной непрерывной области. Иначе пришлось бы "закопать" весь STL :)) Мне кажется что в данной ситуации все ровно наоборот ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2016, 15:12 |
|
||
|
Ручное назначение номеров индексов массива
|
|||
|---|---|---|---|
|
#18+
И конечно возможность проводить сравнение с элементов следующим за последним элементов скорее всего связана с устоявшейся традицией работать с полуоткрытыми интервалами при непосредственном кодировании и разработке алгоритмов [a,b), т.о. классический цикл в качестве шаблона будет иметь следующий вид: for(T i=0;i<n;++i){ smth do } из чего следует необходимость распространения арифметики указателей на элемент после последнего элемента массива ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2016, 15:23 |
|
||
|
Ручное назначение номеров индексов массива
|
|||
|---|---|---|---|
|
#18+
SashaMercuryВы выше писали про то, что трюки не обязаны соответствовать стандарту, более того, по определению ub SashaMercury, вы как-то интересно надёргиваете мои слова. Я ни где не писал, что ВСЕ трюки - UB. Как и то, что все UB - трюки... Неужели нужно переформулировать? Ок: большинство трюков (нужно ли уточнять, что из тех, что я видел?) являются UB по определению UB. SashaMercuryУ нас с вами разные определения для этого слова. На мой взгляд трюк это что-то законное, но не явное. Можно подумать, UB - это что-то незаконное :). UB это всего лишь UB. Стандарт регламентирует ряд ситуаций. Есть ситуации, которые стандарт отказывается регламентировать. Эти ситуации и есть Undefined стандартом Behavior, т.е. по-просту неопределённые. Это значит, что в этих ситуациях может произойти что угодно, и это "что угодно" будет законным. И зависеть от усмотрения разработчика (компилятора). Например, Код: plaintext 1. 2. 3. 4. чистой воды UB, но при этом этот код спокойно откомпилируется компиляторами от MS, от Borland (а, ну да - Embarcadero), но тот же gcc выдаст ошибку компиляции )) SashaMercuryBagaBagaPS Да, к стати, никого не смущает, что итератор end() указывает _ЗА_ последний элемент? Похоже, что именно для этой практики в адресной арифметике в стандарте сделано исключение - можно получать (про разъыменовывать - ни ни) адрес, на один элемент больший, чем последний адрес выделенной непрерывной области. Иначе пришлось бы "закопать" весь STL :)) Мне кажется что в данной ситуации все ровно наоборот Что - ровно наоборот? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2016, 21:39 |
|
||
|
Ручное назначение номеров индексов массива
|
|||
|---|---|---|---|
|
#18+
SashaMercuryИ конечно возможность проводить сравнение с элементов следующим за последним элементов скорее всего связана с устоявшейся традицией работать с полуоткрытыми интервалами при непосредственном кодировании и разработке алгоритмов [a,b), т.о. классический цикл в качестве шаблона будет иметь следующий вид: for(T i=0;i<n;++i){ smth do } из чего следует необходимость распространения арифметики указателей на элемент после последнего элемента массива Вот из чего что следует, тут совершенно непонятно ))) Вы привели классический пример цикла из С и С++. Вот только он не соответствует устоявшейся практике разработчиков STL. Загляните, там полно другого кода, всё больше в стиле Код: plaintext 1. 2. 3. 4. Обратите внимание, типовая реализация от STL требует только наличия оператора сравнения на равенство (ну, или неравенство). Ваш же цикл требует значительно большего - он требует не только сравнимости равно - не равно (как в STL), но и упорядоченности (какой из двух элементов больше). Причём, строгой :)). Что может вызвать некоторые проблемы, причём ровно те же, что и UB в решении с трюком-на-указателях :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2016, 21:46 |
|
||
|
Ручное назначение номеров индексов массива
|
|||
|---|---|---|---|
|
#18+
BagaBagaВот из чего что следует, тут совершенно непонятно ))) Очень даже понятно. Если последний элемент занимает последние байты адресного пространства, то это бесконечный цикл, т.к. ++ уведет в начало. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2016, 21:50 |
|
||
|
Ручное назначение номеров индексов массива
|
|||
|---|---|---|---|
|
#18+
Dima T, следуйте соглашениям STL и используйте "!=" вместо "<" - тогда и "бесконечного цикла" не будет :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2016, 22:34 |
|
||
|
Ручное назначение номеров индексов массива
|
|||
|---|---|---|---|
|
#18+
BagaBaga, у нас здесь не курица с яйцом и не сообщество благородных девиц Сорбонны, потому софистикой заниматься мне не интересно. Вы безусловно можете оставаться при своем мнении ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2016, 02:22 |
|
||
|
Ручное назначение номеров индексов массива
|
|||
|---|---|---|---|
|
#18+
BagaBaga Ваш же цикл требует значительно большего - он требует не только сравнимости равно - не равно (как в STL), но и упорядоченности (какой из двух элементов больше). Причём, строгой :)). Что может вызвать некоторые проблемы, причём ровно те же, что и UB в решении с трюком-на-указателях :) Приведите пожалуйста пример ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2016, 02:27 |
|
||
|
Ручное назначение номеров индексов массива
|
|||
|---|---|---|---|
|
#18+
SashaMercuryBagaBaga, у нас здесь не курица с яйцом и не сообщество благородных девиц Сорбонны, потому софистикой заниматься мне не интересно. Вы безусловно можете оставаться при своем мнении Софистикой здесь занимаетесь только вы. Укажите на пункт стандарта, запрещающий UB, и тогда я с вами соглашусь. Но вы такого не найдёте. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2016, 10:17 |
|
||
|
Ручное назначение номеров индексов массива
|
|||
|---|---|---|---|
|
#18+
SashaMercuryBagaBaga Ваш же цикл требует значительно большего - он требует не только сравнимости равно - не равно (как в STL), но и упорядоченности (какой из двух элементов больше). Причём, строгой :)). Что может вызвать некоторые проблемы, причём ровно те же, что и UB в решении с трюком-на-указателях :) Приведите пожалуйста пример Вам же привели пример Dima TЕсли последний элемент занимает последние байты адресного пространства, то это бесконечный цикл, т.к. ++ уведет в начало. Вам достаточно подобрать такой адрес, когда it < end() заведомо не выполнится. Т.е. в (it+1) будет происходить переполнение, и "неожиданно" (it+1) < it < end() :) Как думаете, что выдаст в качестве значения "с" Код: plaintext 1. 2. 3. такой код? Всегда ли он вернёт одно и то же? Зависит ли возвращаемое от чего-либо? Вернёт ли он что либо? ))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2016, 10:24 |
|
||
|
Ручное назначение номеров индексов массива
|
|||
|---|---|---|---|
|
#18+
BagaBaga, я рискну предположить что данный UB относится не к циклам и шаблону итераторов, а к переполнению разрядной сетки в принципе. Я предлагаю участника вообще закрыть это направление. Тем более что градус напряжения в сабже поднялся, а сегдня - пятница и надо ходить в гавайской рубашке и шортах и быть няшкой и вообще... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2016, 11:46 |
|
||
|
Ручное назначение номеров индексов массива
|
|||
|---|---|---|---|
|
#18+
mayton, рискну предположить, что "проблемы трюка - с - указателем" как раз и проявляются из-за необработки "переполнения" - выхода результирующего адреса за диапазон допустимых значений (e.g., за границы выделенного сегмента). SashaMercury привёл код SashaMercuryт.о. классический цикл в качестве шаблона будет иметь следующий вид: for(T i=0;i<n;++i){ smth do } и попросил меня SashaMercuryBagaBaga ... Что может вызвать некоторые проблемы, причём ровно те же, что и UB в решении с трюком-на-указателях :) Приведите пожалуйста пример показать его проблемы. Для чего мне пришлось привести пример, Код: plaintext 1. 2. 3. полностью повтояющий структуру приведённого т.н. "классического цикла", но при этом являющийся UB в чистом виде. PS Я только за гавайские рубашки :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2016, 13:15 |
|
||
|
Ручное назначение номеров индексов массива
|
|||
|---|---|---|---|
|
#18+
Dima TЕсли последний элемент занимает последние байты адресного пространства, то это бесконечный цикл, т.к. ++ уведет в начало. А можете привести пример в котором создается такая ситуация ? ))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2016, 13:18 |
|
||
|
Ручное назначение номеров индексов массива
|
|||
|---|---|---|---|
|
#18+
BagaBaga, ваши контрпримеры неудачны. Придумайте что-нибудь получше ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2016, 13:21 |
|
||
|
Ручное назначение номеров индексов массива
|
|||
|---|---|---|---|
|
#18+
SashaMercuryBagaBaga, ваши контрпримеры неудачны. Придумайте что-нибудь получше ;) Ну так и давайте по пунктам: - в чём конкретно они неудачны и почему: - на основании каких критериев сделаны такие выводы; - откуда вообще эти "критерии" взялись? Желательно, со ссылками на стандарт. И да, где ссылка на пункт стандарта, утверждающего "UB - это незаконно"? :) Вы же так обильно его цитируете, приведите и здесь ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2016, 13:34 |
|
||
|
Ручное назначение номеров индексов массива
|
|||
|---|---|---|---|
|
#18+
BagaBagaSashaMercuryBagaBaga, ваши контрпримеры неудачны. Придумайте что-нибудь получше ;) Ну так и давайте по пунктам: - в чём конкретно они неудачны и почему: - на основании каких критериев сделаны такие выводы; - откуда вообще эти "критерии" взялись? Желательно, со ссылками на стандарт. И да, где ссылка на пункт стандарта, утверждающего "UB - это незаконно"? :) Вы же так обильно его цитируете, приведите и здесь ) Неудачны потому, что ничего не доказывают. Мне кажется, что ваш пример скорее относится к implementation-defined behavior, нежели к ub. Но это не существенно в любом случае, т.к. из этого не следует что именно операция сравнения привела к этому. Можно привести аналогичный пример с операцией сравнения. Такого пункта в стандарте быть не может(в явном виде), так-же как и нет такого закона, который запрещает кому-либо спрыгнуть с 5 этажа. И вы это прекрасно знаете, т.о. вы намеренно ставите это утверждение как центральное по этому вопросу, значит вы намеренно занимаетесь софистикой. И никаких критериев относительно качества контрпримеров в стандарте языка очевидно быть не может. Еще один странный вопрос. Что вы пытаетесь доказать? Что ub это норма? Так вот, это такая-же норма как и поведение того идиота в Ницце. Вчера он обыкновенный тунисец, а сегодня он давит людей. Вчера этот участок кода работал, сегодня вы имеете крах программы или что-нибудь похуже. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2016, 14:47 |
|
||
|
Ручное назначение номеров индексов массива
|
|||
|---|---|---|---|
|
#18+
SashaMercuryНеудачны потому, что ничего не доказывают. ... из этого не следует что именно операция сравнения привела к этому. Именно операция сравнения знакового char и беззнакового 255 привела к UB. Но для вас, так и быть, "из этого не следует"... Модератор: Прекращайте спорить ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2016, 15:12 |
|
||
|
Ручное назначение номеров индексов массива
|
|||
|---|---|---|---|
|
#18+
ukugyul552465К примеру, есть массив int numbers[4], он состоит из элементов: numbers[0]; numbers[1]; numbers[2]; numbers[3]; Можно ли переназначить индекс элементов, чтобы массив int numbers[4] состоял из элементов: numbers[2000]; numbers[2001]; numbers[2002]; numbers[2003].Можно так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. BagaBagaМожно подумать, UB - это что-то незаконное :). UB это всего лишь UB. Стандарт регламентирует ряд ситуаций. Есть ситуации, которые стандарт отказывается регламентировать. Эти ситуации и есть Undefined стандартом Behavior, т.е. по-просту неопределённые. Это значит, что в этих ситуациях может произойти что угодно, и это "что угодно" будет законным. И зависеть от усмотрения разработчика (компилятора).По-моему, вы смешиваете две принципиально разные вещи -- unspecified behavior и undefined behavior. Undefined behavior плохо тем, что оптимизирующий компилятор полагается на то, что оно не случается. Например, есть код: Код: plaintext 1. 2. 3. 4. 5. 6. Знаковое (signed) переполнение -- это undefined behavior, оптимизирующий компилятор полагается на то, что оно не случается. Значит, условие в if -- всегда true, его можно не проверять, а вызов функции handle_overflow -- вообще выкинуть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2016, 03:37 |
|
||
|
Ручное назначение номеров индексов массива
|
|||
|---|---|---|---|
|
#18+
Пётр СедовПо-моему, вы смешиваете две принципиально разные вещи -- unspecified behavior и undefined behavior. Undefined behavior плохо тем, что оптимизирующий компилятор полагается на то, что оно не случается. Например, есть код: Код: plaintext 1. 2. 3. 4. 5. 6. Знаковое (signed) переполнение -- это undefined behavior, оптимизирующий компилятор полагается на то, что оно не случается. Значит, условие в if -- всегда true, его можно не проверять, а вызов функции handle_overflow -- вообще выкинуть. Пётр, чесслово, очень хотелось бы увидеть на русском "на пальцах" (но без "распальцовки :) ) объяснение, что же такое undefined behavior, unspecified behavior, и на каких критериях (желательно, всё же формальных, а то ведь скатимся до "я ТАК вижу") и тест-кейсах можно отличить одно от другого. Если честно, мне немного непривычно, что в качестве примера unspecified behavior вы привели результаты работы оптимизатора. Оптимизатор, это такая "вещь в себе", что его работа остаётся загадкой - т.к. зависит от набора доступных ему правил преобразования кода и умения "распознавать" .. клише, что-ли... для оптимизации. И первое, и последнее зависят от разработчиков. Но на первое мы можем влиять через ключи. Правда, мало кто на себе (на своём коде, конечно же) прочувствовал, что выбирая опцию выше O2 собственноручно позволяешь ему произвести ... как бы это ... исполняемый, но неработающий как ожидается код :) Как думаете, прав ли будет оптимизатор, выкидывая конструкцию вида Код: plaintext 1. 2. 3. 4. 5. ? А удивление моё вызвано простой вещью. Существует очень старый, ещё со времён С, пример. Как думаете, что вернёт код Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2016, 10:44 |
|
||
|
Ручное назначение номеров индексов массива
|
|||
|---|---|---|---|
|
#18+
BagaBagaПётр, чесслово, очень хотелось бы увидеть на русском "на пальцах" (но без "распальцовки :) ) объяснение, что же такое undefined behavior, unspecified behavior, и на каких критериях (желательно, всё же формальных, а то ведь скатимся до "я ТАК вижу") и тест-кейсах можно отличить одно от другого.Да я просто в Wikipedia-и читал: undefined behavior unspecified behavior Ну и в русско-язычной Wikipedia-и тоже есть статьи. Ещё есть статья на cppreference.com. Хотя если глубоко разбираться, то надо стандарт C++ читать, но там много букв. BagaBagaЕсли честно, мне немного непривычно, что в качестве примера unspecified behavior вы привели результаты работы оптимизатора.Там было про undefined behavior :). BagaBagaКак думаете, прав ли будет оптимизатор, выкидывая конструкцию вида Код: plaintext 1. 2. 3. 4. 5. ?Думаю, прав. Здесь же нет volatile, поэтому можно выкинуть if. Вот если написать «volatile double d = 1;», то компилятор должен сохранить if, потому что мы сообщили ему, что другой поток (thread) может в любой момент изменить значение переменной d. BagaBagaА удивление моё вызвано простой вещью. Существует очень старый, ещё со времён С, пример. Как думаете, что вернёт код Код: plaintext 1. 2. 3. В последней строке -- два побочных эффекта на одну и ту же переменную, это undefined behavior, насколько я понимаю. Так что неизвестно, что тут будет происходить, и этот код надо переписать. Ну и в старом C-шном коде не может быть лямбды :). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.07.2016, 01:13 |
|
||
|
Ручное назначение номеров индексов массива
|
|||
|---|---|---|---|
|
#18+
Пётр СедовBagaBagaЕсли честно, мне немного непривычно, что в качестве примера unspecified behavior вы привели результаты работы оптимизатора.Там было про undefined behavior :). тогда согласен :) Пётр Седов BagaBagaКак думаете, прав ли будет оптимизатор, выкидывая конструкцию вида Код: plaintext 1. 2. 3. 4. 5. ?Думаю, прав. Здесь же нет volatile, поэтому можно выкинуть if. Вот если написать «volatile double d = 1;», то компилятор должен сохранить if, потому что мы сообщили ему, что другой поток (thread) может в любой момент изменить значение переменной d. volatile здесь совершенно непричем. И нет ни слова о многопоточности. Этот код - x!=x - не что иное как полный аналог isnan(x). NaN - это единственное число, коротое не равно самому себе :) Так что будет выкинута проверка получения не-числа... Пётр СедовBagaBagaА удивление моё вызвано простой вещью. Существует очень старый, ещё со времён С, пример. Как думаете, что вернёт код Код: plaintext 1. 2. 3. В последней строке -- два побочных эффекта на одну и ту же переменную, это undefined behavior, насколько я понимаю. Так что неизвестно, что тут будет происходить, и этот код надо переписать. Ну и в старом C-шном коде не может быть лямбды :). Про лямбду. Замените её на функцию :) Это просто чтобы "визуально омолодить" пример и сэкономить пару строк на экране. В стандарте С++ (и С - тоже) порядок вычисления аргументов, переданных в функцию, unspecified. Результат, взвращаемый данной функцией, корректен, но завсист от прядка вычисления аргументов. Так что это был пример на unspecified behavior. Ради интереса, попробуйте скомпилировать его же на компиляторе MS C++ под x86 и под ARM - получите разные результаты :) Его можно (при желании) привратить в UB, если допустить вычисление параметров конкурентно в __разных__ потоках (вот тогда получим UB из-за "одновременного" доступа к "незащищённой" переменной из разных потоков...), вот только ни один компилятор, на сколько я знаю, такого извращения не делает :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.07.2016, 18:30 |
|
||
|
Ручное назначение номеров индексов массива
|
|||
|---|---|---|---|
|
#18+
BagaBagavolatile здесь совершенно непричем. И нет ни слова о многопоточности. volatile в С/С++ к многопоточности не имеет отношения. volatile означает нестандартная память, т.е. "не оптимизировать и перечитывать при каждом обращении", например в память проецируется показания каких-то датчиков и каждый их опрос вызывает какое-то действие. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.07.2016, 18:42 |
|
||
|
Ручное назначение номеров индексов массива
|
|||
|---|---|---|---|
|
#18+
Dima T, ок. volatile здесь означает "выход в другую вселенную", или мене поэтично - значение переменной может измениться независимым от программы способом (например, как значение от внешнего датчика). volatile заставляет при генерации ассемблерного кода не выкидывать инструкии чтения значения из "памяти" в регистр как достаточно медленную операцию. Без этого слова вы можете обнаружить, что программа вдруг показания датчика "не считвает" (а в ассемблерном коде обнаружить, что значение кешируется или, что даже чаще - вообще "заоптимизировано" и вычислено на этапе компиляции... ведь вот же значение, зачем его вычислять рантайм... ну а о его возможных изменениях никто бедному компилятору не сообщит без volatile). Некоторые программисты ошибочно используют это слово для решения проблем совместного использования разными потоками. Увы, это ничего не решает. volatile не имеет отношения к многопоточности. А что же у меня были за слова про многопоточнось? Это был ответ на фразу "Вот если написать «volatile double d = 1;», то компилятор должен сохранить if, потому что мы сообщили ему, что другой поток (thread) может в любой момент изменить значение переменной d." ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.07.2016, 19:00 |
|
||
|
Ручное назначение номеров индексов массива
|
|||
|---|---|---|---|
|
#18+
BagaBagaЭтот код - x!=x - не что иное как полный аналог isnan(x).Так лучше функцию isnan и использовать, а то вдруг на какой-нибудь платформе попытка использовать NAN приведёт к аппаратному прерыванию. BagaBagaТак что это был пример на unspecified behavior.«f(++i,++i)» -- это как раз undefined behavior: // http://en.cppreference.com/w/cpp/language/ub Examples of undefined behavior are ..., modification of the same scalar more than once in an expression without sequence points, ... Dima Tvolatile в С/С++ к многопоточности не имеет отношения.Ну std::atomic далеко не всегда был, некоторые люди до сих пор сидят на старых компиляторах. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.07.2016, 19:10 |
|
||
|
Ручное назначение номеров индексов массива
|
|||
|---|---|---|---|
|
#18+
Я разбирался с темой volatile в многопоточности http://www.sql.ru/forum/1195434/std-atomic-bool-ili-volatile-bool-est-raznica А после в книжке прочитал что volatile в С нужен для всяких экзотических случаев, т.к. на нем драйвера пишут, софт для экзотических девайсов и т.д. суть volatile - просто запретить компилятору все оптимизации и тупо делать как написали в коде. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.07.2016, 19:13 |
|
||
|
Ручное назначение номеров индексов массива
|
|||
|---|---|---|---|
|
#18+
Пётр СедовBagaBagaЭтот код - x!=x - не что иное как полный аналог isnan(x).Так лучше функцию isnan и использовать, а то вдруг на какой-нибудь платформе попытка использовать NAN приведёт к аппаратному прерыванию. На момент появления "трюка" стандартного isnan не существовало. Кроме того, не факт, что в используемом компиляторе под все целевые платформы isnan реализована. Ну и наконец, ни кто не будет править исправно работающий и проверенный десятилетиями код только ради сахара. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.07.2016, 19:37 |
|
||
|
Ручное назначение номеров индексов массива
|
|||
|---|---|---|---|
|
#18+
Пётр СедовBagaBagaТак что это был пример на unspecified behavior.«f(++i,++i)» -- это как раз undefined behavior: // http://en.cppreference.com/w/cpp/language/ub Examples of undefined behavior are ..., modification of the same scalar more than once in an expression without sequence points, ... Dima Tvolatile в С/С++ к многопоточности не имеет отношения.Ну std::atomic далеко не всегда был, некоторые люди до сих пор сидят на старых компиляторах. Ключевое выделено красным. В применяемой по дефолту модели памяти в приведённом примере есть "sequence points". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.07.2016, 19:42 |
|
||
|
Ручное назначение номеров индексов массива
|
|||
|---|---|---|---|
|
#18+
Пётр СедовDima Tvolatile в С/С++ к многопоточности не имеет отношения.Ну std::atomic далеко не всегда был, некоторые люди до сих пор сидят на старых компиляторах. Это не меняет того факта, что volatile не предназначен для решения проблем многопоточности. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.07.2016, 19:45 |
|
||
|
Ручное назначение номеров индексов массива
|
|||
|---|---|---|---|
|
#18+
BagaBagaНа момент появления "трюка" стандартного isnan не существовало. Кроме того, не факт, что в используемом компиляторе под все целевые платформы isnan реализована.Функцию isnan легко сделать самому. BagaBagaНу и наконец, ни кто не будет править исправно работающий и проверенный десятилетиями код только ради сахара.«if(d !=d)» -- это плохо читаемый код, потому что здесь написано совсем не то, что имел в виду программист («если в переменной d хранится NAN»). BagaBagaПётр Седовпропущено... «f(++i,++i)» -- это как раз undefined behavior: пропущено... Ключевое выделено красным. В применяемой по дефолту модели памяти в приведённом примере есть "sequence points".Для текущего стандарта, вот именно про этот код написано, что здесь undefined behavior: // http://en.cppreference.com/w/cpp/language/eval_order Код: plaintext 1. Да и GCC 4.8.4 при компиляции этого кода выдаёт предупреждение: Код: plaintext BagaBagaЭто не меняет того факта, что volatile не предназначен для решения проблем многопоточности.Теоретически (по стандарту) -- да, а на практике многопоточный код на C++ писали задолго до появления std::atomic. Например, у Рихтера в старом издании книги «Programming Applications for Windows» есть такой код: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. volatile -- это был единственный способ указать компилятору, что переменная используется несколькими потоками. Ещё в документации к Visual C++ 2010 написано: // https://msdn.microsoft.com/en-us/library/12a04hfd(v=vs.100).aspx The volatile keyword is a type qualifier used to declare that an object can be modified in the program by something such as the operating system, the hardware, or a concurrently executing thread. И Visual C++ до сих пор воспринимает volatile как «многопоточная переменная», чтобы не ломать старый код: // https://msdn.microsoft.com/en-us/library/12a04hfd(v=vs.140).aspx Visual Studio 2015 ... Microsoft Specific When the /volatile:ms compiler option is used—by default when architectures other than ARM are targeted—the compiler generates extra code to maintain ordering among references to volatile objects in addition to maintaining ordering to references to other global objects. In particular: * A write to a volatile object (also known as volatile write) has Release semantics; that is, a reference to a global or static object that occurs before a write to a volatile object in the instruction sequence will occur before that volatile write in the compiled binary. * A read of a volatile object (also known as volatile read) has Acquire semantics; that is, a reference to a global or static object that occurs after a read of volatile memory in the instruction sequence will occur after that volatile read in the compiled binary. This enables volatile objects to be used for memory locks and releases in multithreaded applications. http://en.cppreference.com/w/cpp/atomic/memory_order Relationship with volatile ... One notable exception is Visual Studio, where, with default settings, every volatile write has release semantics and every volatile read has acquire semantics (MSDN), and thus volatiles may be used for inter-thread synchronization. Понятно, что сейчас лучше использовать std::atomic, но при этом странно читать утверждения вроде «volatile в С/С++ к многопоточности не имеет отношения», потому что есть «volatile по стандарту», но есть и «volatile по понятиям». ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2016, 10:51 |
|
||
|
Ручное назначение номеров индексов массива
|
|||
|---|---|---|---|
|
#18+
Пётр СедовBagaBagaНа момент появления "трюка" стандартного isnan не существовало. Кроме того, не факт, что в используемом компиляторе под все целевые платформы isnan реализована.Функцию isnan легко сделать самому. Ок. Я определю isnan как Код: plaintext 1. 2. 3. и в результате оптимизатор заменит её вызво на вечный false? Помним же - речь была в контексте оптимизатора. Раньше он выкидывал ветвь условного оператора, а будет выкидывать вызов функции, делов-то... Что так, что эдак - одна фигня... т.е. нерабочий код. Но вы так и не ответили: нафига переписывать нормальный работающий код? Вам больше делать на работе нечего? Пётр СедовBagaBagaНу и наконец, ни кто не будет править исправно работающий и проверенный десятилетиями код только ради сахара.«if(d !=d)» -- это плохо читаемый код, потому что здесь написано совсем не то, что имел в виду программист («если в переменной d хранится NAN»). Это хорошо известная идиома, такая же как Код: plaintext 1. Хорошо детектирует неофита на ниве использования С/С++ для численного счёта :) Пётр СедовДа и GCC 4.8.4 при компиляции этого кода выдаёт предупреждение: Код: plaintext Что же мне для вас всё красным приходится выделять. Не все предупреждения и ошибки компиляции действительно состоят в том, о чём выводит текст компилятор... Пётр СедовBagaBagaЭто не меняет того факта, что volatile не предназначен для решения проблем многопоточности.Теоретически (по стандарту) -- да Этого - достаточно. Не далее как пару страниц назад г-н SashaMercury очень методично высказывался на трюк-с-указателем по поводу "не по стандарту" (точнее, про "это ж UB" !!! ). Так что - либо только стандарт и никаких UB, либо "а фиг с этим стандартом, у нас и так работает" :)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2016, 15:32 |
|
||
|
Ручное назначение номеров индексов массива
|
|||
|---|---|---|---|
|
#18+
BagaBagaПётр Седовпропущено... Функцию isnan легко сделать самому. Ок. Я определю isnan как Код: plaintext 1. 2. 3. Так гораздо лучше, потому что трюк локализован в функции с понятным именем, а не растиражирован по всей программе. BagaBagaи в результате оптимизатор заменит её вызво на вечный false?GCC 4.8.4 c включённой оптимизацией (-O3) сохраняет проверку, и трюк работает. Как поступит другой компилятор -- не знаю. BagaBagaНо вы так и не ответили: нафига переписывать нормальный работающий код?Чтобы код был понятен программистам, которые не знакомы с трюком. Например, если есть код: Код: plaintext 1. то его надо переписать так: Код: plaintext 1. 2. 3. 4. 5. 6. BagaBagaПётр Седовпропущено... «if(d !=d)» -- это плохо читаемый код, потому что здесь написано совсем не то, что имел в виду программист («если в переменной d хранится NAN»). Это хорошо известная идиома,Скорее, не очень известный трюк. О нём разве пишут в учебниках по C++? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2016, 03:59 |
|
||
|
Ручное назначение номеров индексов массива
|
|||
|---|---|---|---|
|
#18+
Пётр СедовBagaBagaи в результате оптимизатор заменит её вызво на вечный false?GCC 4.8.4 c включённой оптимизацией (-O3) сохраняет проверку, и трюк работает. Как поступит другой компилятор -- не знаю. так и исходная конструкция (не запрятанная в функцию) также не будет исключена. А потом проверить обе конструкции на icc с максимально агрессивной оптимизацией :) Пётр СедовBagaBagaНо вы так и не ответили: нафига переписывать нормальный работающий код?Чтобы код был понятен программистам, которые не знакомы с трюком. Так и запишем. Чтобы был понятен программистам с меньшей квалификацией. Вопрос только, до какого уровня опускаться? Пётр Седов Код: plaintext 1. то его надо переписать так: Код: plaintext 1. 2. 3. 4. 5. 6. О вкусах, конечно, не спорят (как и о замечательной книге Алгоритмические трюки для программистов), но проверку на степени двойки обычно делают при помощи битовых сдвигов. Когда-то так было быстрее, чем с использованием арифметики. А к этой реализации есть и стилевые вопросы: сначала используются битовое &, а затем логическое == 0. Странное, ведь в С (и С++) есть прекрасная идиома (!с) вместо (с == 0). Обычно так пишут новички в С/С++, только пришедшие из "более других языков". А если из совсем "более других языков", то могут написать и ( 0 == с ) только для того, чтобы отловить места, в которых они = и == попутали ) Пётр СедовBagaBagaЭто хорошо известная идиома,Скорее, не очень известный трюк. О нём разве пишут в учебниках по C++? В хороших книгах по численным методам - пишут. Иначе вы не сможете прочесть половину кода открытых моделей NASA... правда, фортрана там всё же больше :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2016, 11:37 |
|
||
|
Ручное назначение номеров индексов массива
|
|||
|---|---|---|---|
|
#18+
Генри Уоррен в своей книге описал почти все трюки с целочисленной арифметикой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2016, 12:17 |
|
||
|
Ручное назначение номеров индексов массива
|
|||
|---|---|---|---|
|
#18+
Пётр СедовЧтобы код был понятен программистам, которые не знакомы с трюком. Например, если есть код: Код: plaintext 1. то его надо переписать так: ... можно просто комментарий написать Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2016, 12:49 |
|
||
|
Ручное назначение номеров индексов массива
|
|||
|---|---|---|---|
|
#18+
Dima T, такой код сложно поддерживать. Уж лучше макрос или функция. Атомарно по крайней мере с точки зрения смысла. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2016, 14:37 |
|
||
|
Ручное назначение номеров индексов массива
|
|||
|---|---|---|---|
|
#18+
BagaBagaпроверку на степени двойки обычно делают при помощи битовых сдвигов. Когда-то так было быстрее, чем с использованием арифметики. А к этой реализации есть и стилевые вопросы:И в итоге, как выглядит идеальная функция, которая проверяет, является ли число степенью двойки? BagaBagaв С (и С++) есть прекрасная идиома (!с) вместо (с == 0).Я пишу так: !x -- для bool x == 0 -- для чисел BagaBagaИначе вы не сможете прочесть половину кода открытых моделей NASA...Надеюсь, никогда в жизни не придётся разбираться в коде, который написали учёные. Куча переменных с именами из одной буквы -- это нечто. Dima Tможно просто комментарий написатьЛучше, когда код понятен без комментариев. Код: plaintext 1. Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2016, 18:33 |
|
||
|
Ручное назначение номеров индексов массива
|
|||
|---|---|---|---|
|
#18+
Пётр СедовНадеюсь, никогда в жизни не придётся разбираться в коде, который написали учёные. Куча переменных с именами из одной буквы -- это нечто. Учоные - это не фарисеи и саддукеи. И их код ничем особо не будет отличаться от того как мы пишем если речь идет о C/C++. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2016, 18:39 |
|
||
|
Ручное назначение номеров индексов массива
|
|||
|---|---|---|---|
|
#18+
Пётр Седовразбираться в коде, который написали учёные. Куча переменных с именами из одной буквы -- это нечто. На заре карьеры довелось сопровождать прогу разработки конца 80х на FoxBase. Наименование таблиц БД (dbf-ки) a001, a002, a003 ... это был ахтунг, я думал это просто маньяк какой-то написал, потом узнал что и другие с этим сталкивались, оказывается это целая школа разработчиков таких была в то время. Пётр СедовDima Tможно просто комментарий написатьЛучше, когда код понятен без комментариев. На вкус и цвет ... Только выше самплес был другой, и главное - обоснование "незнающие не поймут", ну так им вынесенное в отдельную функцию не намного понимание улучшит, так что комментарий нужен, другой вопрос у if`а или у функции, тут дело вкуса фломастеров. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2016, 18:52 |
|
||
|
Ручное назначение номеров индексов массива
|
|||
|---|---|---|---|
|
#18+
Dima TТолько выше самплес был другой, и главное - обоснование "незнающие не поймут", ну так им вынесенное в отдельную функцию не намного понимание улучшит,Как раз улучшит. Выносим проверку на степень двойки в отдельную функцию => в коде появляется имя «is_pow_2», которое ясно даёт понять, что происходит => комментарий «если width и height степени двойки» не нужен, потому что он просто повторяет код. Dima Tтак что комментарий нужен, другой вопрос у if`а или у функции,А у функции зачем комментарий? Типа так? Код: plaintext 1. 2. 3. 4. Так тут из имени функции понятно, что она делает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2016, 19:22 |
|
||
|
Ручное назначение номеров индексов массива
|
|||
|---|---|---|---|
|
#18+
Пётр СедовА у функции зачем комментарий? Типа так? Код: plaintext 1. 2. 3. 4. Так тут из имени функции понятно, что она делает. Лично мне тут не нужен, т.к. я знал но забыл что такое x & (x - 1) == 0, но если не знаешь изначально, и не знаешь что такое "pow" (я это тоже знал но забыл за ненадобностью, ни разу в жизни pow() не использовал), то понятнее не становится без нормального комментария. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2016, 19:41 |
|
||
|
Ручное назначение номеров индексов массива
|
|||
|---|---|---|---|
|
#18+
Dima Tя это тоже знал но забыл а что такое степень двойки - не забыл? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2016, 19:45 |
|
||
|
Ручное назначение номеров индексов массива
|
|||
|---|---|---|---|
|
#18+
Изопропила что такое степень двойки - не забыл? Разбуди с глубокого перепою - скажу любую степень до 2^20 в десятичном исчислении. Полтора года счета в тетрадке в двоичном представлении не забываются Только степень двойки для меня это не pow() а битовый сдвиг << ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2016, 19:54 |
|
||
|
Ручное назначение номеров индексов массива
|
|||
|---|---|---|---|
|
#18+
Сдвиг дает умножение константы на 2. Но это не всегда будет степенью двойки. Суть формулы Уоррена в том что мы формируем маску из младших битов и проверяем что пересечение дает пустоту. Это и есть проверка на степень двойки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2016, 19:59 |
|
||
|
Ручное назначение номеров индексов массива
|
|||
|---|---|---|---|
|
#18+
maytonСдвиг дает умножение константы на 2. Но это не всегда будет степенью двойки. Частный случай: сдвиг единицы всегда будет степенью двойки. PS Я электронщик по образованию, нас дрючили за двоичную логику, из нее элементы И-НЕ, ИЛИ-НЕ из них триггеры (типа RAM), сумматоры (типа АЛУ) и т.д. и т.п. Как спроектировать и спаять процессор я в курсе, только паять очень долго придется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2016, 20:10 |
|
||
|
Ручное назначение номеров индексов массива
|
|||
|---|---|---|---|
|
#18+
maytonСдвиг дает умножение константы на 2. Не умножение на 2, а на 2 в степени на сколько бит сдвинулись. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2016, 20:12 |
|
||
|
Ручное назначение номеров индексов массива
|
|||
|---|---|---|---|
|
#18+
Dima TТолько степень двойки для меня это не pow() а битовый сдвиг < сдвиг - это одна из возможных реализаций. степень двойки - это из предметной области. если вместо is_pow_2 гонять биты и маски - ясное дело, что комментарий требуется. в ряде процессоров имеется команда, выдающая количество единичных бит в операнде. __popcnt16, __popcnt, __popcnt64 - соответствующие интринсики для интела и что теперь - писать __popcnt64(n)==1 ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2016, 20:24 |
|
||
|
Ручное назначение номеров индексов массива
|
|||
|---|---|---|---|
|
#18+
ИзопропилDima TТолько степень двойки для меня это не pow() а битовый сдвиг < сдвиг - это одна из возможных реализаций. степень двойки - это из предметной области. еще раз, математика забыта за ненадобностью, а степень двойки "наше всё" в двоичном мире. Поэтому сдвиг это сдвиг, а никак не возведение в степень. В моем мозгу нет тождественности pow(2,N) и 1<<N, хотя это одно и тоже. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2016, 20:33 |
|
||
|
Ручное назначение номеров индексов массива
|
|||
|---|---|---|---|
|
#18+
Как выше написал, я электронщик, а в электронике сдвиг это просто провода по диагонали, добавить нолики в младшие разряды результата и сделать ИЛИ тому что ушло за разрядность для контроля переполнения. Т.е. максимум один такт вычисления. И возведение в степень: это во первых очень сложная операция умножения, которая основана на сложении и еще надо в цикле все выполнять. Тут такты считать устанешь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2016, 20:52 |
|
||
|
Ручное назначение номеров индексов массива
|
|||
|---|---|---|---|
|
#18+
Dima TИ возведение в степень: это во первых очень сложная операция умножения, которая основана на сложении и еще надо в цикле все выполнять. Тут такты считать устанешь. это забота компилятора. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2016, 21:07 |
|
||
|
Ручное назначение номеров индексов массива
|
|||
|---|---|---|---|
|
#18+
Пётр СедовBagaBagaв С (и С++) есть прекрасная идиома (!с) вместо (с == 0).Я пишу так: !x -- для bool x == 0 -- для чисел В С/С++ нет разницы между целым и булевым. Ноль - ложь, всё иное - истина :). И будет любопытно, как вы начнёте рефаторить код, кода вдруг bool заменят на int или наоборот... В любом случае !x - широко распространённая практики именно в С/С++... Пётр СедовBagaBagaИначе вы не сможете прочесть половину кода открытых моделей NASA...Надеюсь, никогда в жизни не придётся разбираться в коде, который написали учёные. Куча переменных с именами из одной буквы -- это нечто. Могу предложить почитать код на COBOL... на нём точно писали не ученые, но multiplied by вместо знака умножения это ... сильно. И не волнуйтесь, имена из одной буквы вы можете встретьить не только у ученых :). PS Надеюсь, все помнять, что переменные, чьb имена начинаются с i,j,k,l,m,n - целоцисленные по умолчанию? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.07.2016, 14:10 |
|
||
|
Ручное назначение номеров индексов массива
|
|||
|---|---|---|---|
|
#18+
Dima TКак выше написал, я электронщик, а в электронике сдвиг это просто провода по диагонали, добавить нолики в младшие разряды результата и сделать ИЛИ тому что ушло за разрядность для контроля переполнения. Т.е. максимум один такт вычисления. И возведение в степень: это во первых очень сложная операция умножения, которая основана на сложении и еще надо в цикле все выполнять. Тут такты считать устанешь. Дим. Мне кажется это сильно упрощение. Мне кажется здесь ключевое слово не электроника а набор инструкций. Например 1 раунд шифрования за 1 инструкцию. А сдвиг это уже мелочи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.07.2016, 14:31 |
|
||
|
Ручное назначение номеров индексов массива
|
|||
|---|---|---|---|
|
#18+
maytonДим. Мне кажется это сильно упрощение. Мне кажется здесь ключевое слово не электроника а набор инструкций. Например 1 раунд шифрования за 1 инструкцию. А сдвиг это уже мелочи. Реализация в электронике определяет время выполнения инструкций. Вот я к чему. По сути любая электроника это тоже набор инструкций. Только в железе. Базовые блоки всей цифровой электроники - элементы И, И-НЕ, ИЛИ, ИЛИ-НЕ, НЕ и ИСКЛЮЧАЮЩЕЕ ИЛИ (XOR). Каждый это несколько транзисторов/диодов/резисторов . Вот время прохождения транзистора это и есть константа, а сколько транзисторов надо пройти для выполнения каждой инструкции асма зависит от инструкции. Например при выполнении A<<1 все разряды обрабатываются параллельно, тут просто надо скоммутировать 0й разряд входа с 1м выхода и т.д. (готовой схемы не нашел, рисовать лень), а если сделать A+A то уже каскад из одноразрядных сумматоров (рис.10) , т.е. последовательно складываем 0-е разряды, получаем 0-й разряд результата и бит переполнения, передаем его следующему блоку который берет его и 1е разряды и т.д. последовательно каждый разряд. В итоге получили что для 32бит A<<1 в 32 раза быстрее A+A. Это упрощенно, в реале за счет большого количества транзисторов (базовых блоков) можно ускорить например сделав 8-битный сумматор, где 8 разрядов будут параллельно обрабатываться, тогда каскад будет из 4х сумматоров. Вобщем я к тому что измерение скорости в количестве инструкций процессора это очень грубое измерение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.07.2016, 15:51 |
|
||
|
Ручное назначение номеров индексов массива
|
|||
|---|---|---|---|
|
#18+
Dima T, непонятно зачем ты сделал такой глубокий экскурс в fundamentals для меня. Ну да ладно. Я думаю что общая (средняя) производительность бинарного кода зависит конечно-же от алгоритма который ты выбрал. Но мы это просто здесь пропускаем. Считаем что к алгоритму нет замечаений. И второе - это от оптимизатора и от возможностей архитектуры под которую ты собираешь. И не забывать про side-effects. Сдвиги сдвигами но умножение на степень двойки для отрицательных чисел надо реализовать особо или-же в случае сомнений может быть имеет смысл вообще отказаться от сдвигов а просто умножить на 2^N и довериться компиллятору. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.07.2016, 16:16 |
|
||
|
Ручное назначение номеров индексов массива
|
|||
|---|---|---|---|
|
#18+
maytonСдвиги сдвигами но умножение на степень двойки для отрицательных чисел надо реализовать особо двоичное представление отрицательных таково что знак не мешает Значение двоичное представление-11111b-21110b-41100b ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.07.2016, 16:22 |
|
||
|
Ручное назначение номеров индексов массива
|
|||
|---|---|---|---|
|
#18+
Ну правильно. Ты должен гарантировать что будут сгенерированы инструкции SAL/SAR для знакового типа. Только где в части стандарта С++ описано поведение знаковых сдвигов? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.07.2016, 16:34 |
|
||
|
Ручное назначение номеров индексов массива
|
|||
|---|---|---|---|
|
#18+
maytonНу правильно. Ты должен гарантировать что будут сгенерированы инструкции SAL/SAR для знакового типа. Только где в части стандарта С++ описано поведение знаковых сдвигов? Зависит от того каком представлении хранятся отрицательные числа. Если это дополнительное представление (т.е. отрицательное это 2^R - |X|, где R разрядность) то <<1 равносильно умножению на 2. Насколько я знаю везде используют дополнительное представление, т.к. оно намного удобнее для воплощения мат.операций в железе. Т.к. многие операции делаются одинаково независимо от вида операндов (со знаком и без) Например сложение, потом SHR и SAR это вообще синонимы одной и той же команды. ЕМНИП вычитания как такового вообще нет в железе, второй операнд переводится в дополнительную форму и дальше сложение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.07.2016, 13:38 |
|
||
|
Ручное назначение номеров индексов массива
|
|||
|---|---|---|---|
|
#18+
Dima T, а много ты из практики видел альтернативных способов представления знакового целого? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.07.2016, 13:57 |
|
||
|
Ручное назначение номеров индексов массива
|
|||
|---|---|---|---|
|
#18+
maytonDima T, а много ты из практики видел альтернативных способов представления знакового целого? Практики у меня немного, кроме x86 можно сказать ничего не видел, но когда мы изучали двоичную математику (шла в курсе схемотехники год-полтора по 5-6 пар в неделю) про альтернативные варианты нам не рассказывали. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.07.2016, 14:23 |
|
||
|
Ручное назначение номеров индексов массива
|
|||
|---|---|---|---|
|
#18+
Dima TmaytonDima T, а много ты из практики видел альтернативных способов представления знакового целого? Практики у меня немного, кроме x86 можно сказать ничего не видел, но когда мы изучали двоичную математику (шла в курсе схемотехники год-полтора по 5-6 пар в неделю) про альтернативные варианты нам не рассказывали. Аналогично. Из курса системотехники нам рассказали о прямом коде, обратном, и модифицированом обратном коде. Но в своей практике я встречал формат классического 32х битного целого для last-endian (x86) и big-endian (x86_64,spark,Java). Попадают бит-в-бит. Можно сериализовать между С++ и Java целые числа. Другие формы - не встречал. Кстати Java определяет две операции правого сдвига ">>" и ">>>". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.07.2016, 17:36 |
|
||
|
Ручное назначение номеров индексов массива
|
|||
|---|---|---|---|
|
#18+
maytonНо в своей практике я встречал формат классического 32х битного целого для last-endian (x86) и big-endian (x86_64,spark,Java). endian тут вообще ни при чем, это просто порядок читать биты справа-налево или слева-направо, битовый сдвиг ведь сдвиг в сторону старших/младших, а где они (справа или слева) вообще пофиг. maytonКстати Java определяет две операции правого сдвига ">>" и ">>>". Ну так есть два вида сдвига: обычный и циклический. Второй по кругу, то что выпало вставляется с другой стороны. Почитай хэлп почти уверен что >>> циклический. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.07.2016, 18:09 |
|
||
|
Ручное назначение номеров индексов массива
|
|||
|---|---|---|---|
|
#18+
Dima Tendian тут вообще ни при чем, это просто порядок читать биты справа-налево или слева-направо, битовый сдвиг ведь сдвиг в сторону старших/младших, а где они (справа или слева) вообще пофиг. Я делаю акцент на сериализации. maytonПочитай хэлп почти уверен что >>> циклический. Неа ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.07.2016, 18:20 |
|
||
|
Ручное назначение номеров индексов массива
|
|||
|---|---|---|---|
|
#18+
Dima TПочитай хэлп почти уверен что >>> циклический. не угадал - просто беззнаковый сдвиг ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.07.2016, 18:21 |
|
||
|
Ручное назначение номеров индексов массива
|
|||
|---|---|---|---|
|
#18+
ИзопропилDima TПочитай хэлп почти уверен что >>> циклический. не угадал - просто беззнаковый сдвиг а в жаве типов чтоли нет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.07.2016, 20:06 |
|
||
|
Ручное назначение номеров индексов массива
|
|||
|---|---|---|---|
|
#18+
Dima TИзопропилпропущено... не угадал - просто беззнаковый сдвиг а в жаве типов чтоли нет? Все типы - знаковые с точки зрения арифметики целых чисел. Но в момент битовых операций 'and','or','xor' обладают семантикой unsidned. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.07.2016, 20:08 |
|
||
|
Ручное назначение номеров индексов массива
|
|||
|---|---|---|---|
|
#18+
maytonDima Tпропущено... а в жаве типов чтоли нет? Все типы - знаковые с точки зрения арифметики целых чисел. Но в момент битовых операций 'and','or','xor' обладают семантикой unsidned. Тогда понятно, нет беззнаковых для того и костыль >>> ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.07.2016, 20:10 |
|
||
|
|

start [/forum/topic.php?all=1&fid=57&tid=2018463]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
66ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
137ms |
get tp. blocked users: |
2ms |
| others: | 11ms |
| total: | 262ms |

| 0 / 0 |
