Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Ручное назначение номеров индексов массива
|
|||
|---|---|---|---|
|
#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 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=39278997&tid=2018463]: |
0ms |
get settings: |
11ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
71ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
60ms |
get tp. blocked users: |
1ms |
| others: | 13ms |
| total: | 193ms |

| 0 / 0 |
