Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.84/19: Рейтинг темы: голосов - 19, средняя оценка - 4.84
0 / 0 / 0
Регистрация: 03.06.2015
Сообщений: 10

"Тру" и "не тру" программирование

03.06.2015, 17:38. Показов 4345. Ответов 63
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Ниже два куска простейшего кода, которые по функция совершенно идентичны (проверка чисел на соответствие опр. параметру).
Первый:
C++
1
2
3
4
5
6
7
8
9
10
11
12
do
{
    cin >> m >> y;
 
    if ( (m != int(m)) || (y != int(y)) )
    {
        cout << "Сообщение";
        continue;
    }
    break;
}
while (true);
Второй:
C++
1
2
3
4
5
6
7
8
9
10
11
do
{
    cin >> m >> y;
 
    if ( (m != int(m)) || (y != int(y)) )
    {
        cout << "Сообщение";
    }
 
}
while ( (m != int(m)) || (y != int(y)) );
Вопросы: Почему первый вариант, по словам моего преподавателя, "не тру", а второй "тру"? И предпочтительнее ли, в таком случае, второй вариант?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.06.2015, 17:38
Ответы с готовыми решениями:

GetPixel, почему первый иф равен тру, а второй - нет
Уважаемые знатоки, в первом GetPixel корды верхнего левого угла иконки поплавка (певая вкладка, опять таки вверху слева), а во втором...

Программа на Ваше обозревание, что можно еще добавить? Тру критика
Всех приветствую! Уважаемое сообщество КФ, я тут новичок, но хотел бы вступить в ваши ряды, возможно даже стать больше чем серой...

Расскажите про "тру" метод парсинга строки
Опять Добрый день!))) Ой как я ошибался говоря что с парсингом не будет проблем((( Код void GetDirList(const char *Target) { ...

63
04.06.2015, 15:57
Студворк — интернет-сервис помощи студентам

Не по теме:

Tulosba, плохая шутка. Не понравилась.

0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
04.06.2015, 16:01
Цитата Сообщение от Enno Посмотреть сообщение
Доступ к любому стеку есть у любого потока процесса (это ж просто кусок памяти), если мы windows обсуждаем.
Ой ли? Так может и с одного процесса можно в память другого нагадить без лишних хлопот? А как же защищенный режим и виртуальное адресное пространство?
Цитата Сообщение от Enno Посмотреть сообщение
Тему не читал, сразу отвечал.
Вот что было действительно абсурдно.

Добавлено через 1 минуту

Не по теме:

Цитата Сообщение от SatanaXIII Посмотреть сообщение
плохая шутка. Не понравилась.
Почему? Он любит флаги и паровозы :)

0
04.06.2015, 16:08

Не по теме:

Цитата Сообщение от Tulosba Посмотреть сообщение
Почему? Он любит флаги и паровозы
Потому что я не знаю кто это; а загуглив, я выяснил, что это какой-то хрен из какого-то сериала.
Может, для осведомленных людей шутка и знатная, но не для этого раздела она. На мой взгляд. В обовсеме наверное больше народу смотрит всякую фигню.

0
Игогошка!
 Аватар для ct0r
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
04.06.2015, 16:13
Цитата Сообщение от Enno Посмотреть сообщение
Разумеется
Разумеется нет Без синхронизации этот код абсолютно бесполезен. Его поведение непредсказуемо.
0
267 / 170 / 40
Регистрация: 25.08.2014
Сообщений: 1,087
Записей в блоге: 1
04.06.2015, 16:44
Цитата Сообщение от Tulosba Посмотреть сообщение
А как же защищенный режим и виртуальное адресное пространство?
Потоки это не касается. В пределах одного процесса живём. Как минимум я дал понять что двойное проведение проверки совсем ни к чему и описал возможные причины неопределённого поведения. Можно сюда присовокупить затраты на проведение проверки.
0
196 / 197 / 120
Регистрация: 27.05.2011
Сообщений: 545
04.06.2015, 18:03
Цитата Сообщение от Enno Посмотреть сообщение
Потоки это не касается. В пределах одного процесса живём. Как минимум я дал понять что двойное проведение проверки совсем ни к чему и описал возможные причины неопределённого поведения. Можно сюда присовокупить затраты на проведение проверки.
Ну, а если сюда ещё присовокупить работу оптимизатора, который может увидеть, что переменные из этого выражения от одной проверки до другой не меняются, и оптимизировать так, что проверка будет всё-таки одна. Ведь компилятор не ожидает, что вы ещё собрались из одного потока гадить в другой (если вы ему об этом заранее не сообщили с помощью квалификатора volatile). Тут, так сказать, действует неопределённое поведение. Поэтому, всё-таки не стоить лезть в соседний поток и нужно тщательно следить за доступом к памяти, особенно при индексации сишных массивов.
0
 Аватар для Kastaneda
5232 / 3206 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
04.06.2015, 18:14
Цитата Сообщение от ct0r Посмотреть сообщение
Без синхронизации этот код абсолютно бесполезен
А с синхронизацией полезен? Кто будет писать
C++
1
std::cin >> value; // value шарится между потоками
в двух потоках?
0
Игогошка!
 Аватар для ct0r
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
04.06.2015, 22:17
Цитата Сообщение от Kastaneda Посмотреть сообщение
А с синхронизацией полезен
Может быть полезен. По крайней мере он будет делать то, что должен.

Цитата Сообщение от Kastaneda Посмотреть сообщение
Кто будет писать в двух потоках?
Не понял. Кто сказал, что эту строчку надо писать в других потоках?
0
267 / 170 / 40
Регистрация: 25.08.2014
Сообщений: 1,087
Записей в блоге: 1
05.06.2015, 04:33
Цитата Сообщение от mymedia Посмотреть сообщение
присовокупить работу оптимизатора
Ну-ка, что за оптимизатор такой, который вызов 10 операций/функций в различных местах переводит в 5 в одном месте.
Цитата Сообщение от mymedia Посмотреть сообщение
Поэтому, всё-таки не стоить лезть в соседний поток и нужно тщательно следить за доступом к памяти, особенно при индексации сишных массивов.
Это я и дал понять несколькими постами выше. Хорошо что вы со мной согласны.
0
Игогошка!
 Аватар для ct0r
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
05.06.2015, 12:51
Цитата Сообщение от mymedia Посмотреть сообщение
Ведь компилятор не ожидает, что вы ещё собрались из одного потока гадить в другой (если вы ему об этом заранее не сообщили с помощью квалификатора volatile).
Кстати volatile совсем не об этом и совсем не для этого.
0
196 / 197 / 120
Регистрация: 27.05.2011
Сообщений: 545
05.06.2015, 13:05
Цитата Сообщение от Enno Посмотреть сообщение
Ну-ка, что за оптимизатор такой, который вызов 10 операций/функций в различных местах переводит в 5 в одном месте.
Ну, тут я имел ввиду, что в оригинальном посте
Цитата Сообщение от Panic Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
do
{
  cin >> m >> y;
  if ( (m != int(m)) || (y != int(y)) )
  {
    cout << "Сообщение";
  }
}
while ( (m != int(m)) || (y != int(y)) );
оптимизатор может выкинуть вторую проверку условия цикла: ведь если сообщение выводится, то ясно, что цикл уйдёт на следующую итерацию, т.к. в теле условной инструкции m и y не изменяются. Однако и в правду, gcc версии 5.1 с опцией -O3 оптимизирует код как-то наполовину: после ввода m и y происходит проверка условия, если оно ложно, то сразу происходит выход из цикла, иначе выводится сообщение и снова (!) проверяется неизменившееся условие. Т.е. оптимизация произошла, но как-то наполовину…

Цитата Сообщение от ct0r Посмотреть сообщение
Кстати volatile совсем не об этом и совсем не для этого.
Как раз-таки именно для этого. Чтение volatile объекта вызывает побочные эффекты, а, следовательно, это действие нельзя выкинуть из программы.
0
Игогошка!
 Аватар для ct0r
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
05.06.2015, 13:25
Цитата Сообщение от mymedia Посмотреть сообщение
Чтение volatile объекта вызывает побочные эффекты, а, следовательно, это действие нельзя выкинуть из программы.
Ага, только многопоточность и volatile так же соотносятся, как костыли и балерина. Если балерине дать костыли, то она танцевать будет только хуже. volatile абсолютно бесполезен в многопоточной среде, потому что мало того, что не гарантирует никакой атомарности операций, так и мешает оптимизации. Поэтому выражение
Цитата Сообщение от mymedia Посмотреть сообщение
Ведь компилятор не ожидает, что вы ещё собрались из одного потока гадить в другой (если вы ему об этом заранее не сообщили с помощью квалификатора volatile).
вызывает мягко говоря недоумение, особенно в свете того, что компилятор вообще не в курсе, что такое потоки.

volatile нужен для работы со специальной памятью типа memory-mapped IO, где оптимизация чтений/записей приводит к незапланированному поведению. А потоки тут мимо кассы.

Добавлено через 8 минут
Цитата Сообщение от mymedia Посмотреть сообщение
оптимизатор может выкинуть вторую проверку условия цикла: ведь если сообщение выводится, то ясно, что цикл уйдёт на следующую итерацию, т.к. в теле условной инструкции m и y не изменяются. Однако и в правду, gcc версии 5.1 с опцией -O3 оптимизирует код как-то наполовину: после ввода m и y происходит проверка условия, если оно ложно, то сразу происходит выход из цикла, иначе выводится сообщение и снова (!) проверяется неизменившееся условие. Т.е. оптимизация произошла, но как-то наполовину
Потому что компилятору сложно понять, что же делает строка cout << "Сообщение" - там довольно нетривиальный код. Достаточно поменять этот вызов на вызов простой функции, и оптимизация пройдет.
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
05.06.2015, 13:43
Цитата Сообщение от ct0r Посмотреть сообщение
вызывает мягко говоря недоумение
Такое мнение о volatile проистекает из его специфических особенностей (нестандартных) в компиляторе от MS, которые позволяют его использовать именно для предоставления определенных гарантий в многопоточном окружении. Почитать про это можно тут.

Добавлено через 6 минут
Насчет стандартного поведения volatile (и того, почему он не подходит для организации синхронизации для потоков) есть очень хороший ответ здесь. Лично я с ним полностью согласен.
3
Игогошка!
 Аватар для ct0r
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
05.06.2015, 14:01
Цитата Сообщение от DrOffset Посмотреть сообщение
Такое мнение о volatile проистекает из его специфических особенностей (нестандартных) в компиляторе от MS, которые позволяют его использовать именно для предоставления определенных гарантий в многопоточном окружении. Почитать про это можно тут.
Вот оно как.

Оказывается, у них есть магическая опция компилятора, которая позволяет писать непортируемый код c volatile, внезапно реализующей модель памяти release-acquire. Но мне это знание точно не пригодится
0
Evg
05.06.2015, 14:19

Не по теме:

Извините, не удержался. Знатокам оптимизаций и стандартов. Соптимизирует ли компилятор два обращения из указателя p, который смотрит на const (хоть и volatile)?

C
int foo (volatile const *p)
{
  return *p + *p;
}

0
196 / 197 / 120
Регистрация: 27.05.2011
Сообщений: 545
05.06.2015, 14:21
Цитата Сообщение от ct0r Посмотреть сообщение
Ага, только многопоточность и volatile так же соотносятся, как костыли и балерина. Если балерине дать костыли, то она танцевать будет только хуже. volatile абсолютно бесполезен в многопоточной среде, потому что мало того, что не гарантирует никакой атомарности операций, так и мешает оптимизации. Поэтому выражение
Цитата Сообщение от mymedia Посмотреть сообщение
Ведь компилятор не ожидает, что вы ещё собрались из одного потока гадить в другой (если вы ему об этом заранее не сообщили с помощью квалификатора volatile).
вызывает мягко говоря недоумение, особенно в свете того, что компилятор вообще не в курсе, что такое потоки.
Вы, кажется, не так пониммаете volatile. Вот код (конечно, не образец, но как примитивная реализация блокировки сойдёт):
C++
1
2
3
4
5
6
7
8
9
volatile bool flag = true;
void thread1() {
  pause();
  flag = false;
}
void thread2() {
  while (flag) { }
  do_something();
}
Если запустить эти потоки одновременно, то функция do_something всё-таки будет вызвана. Однако если вы уберёте volatile, код отработает не так, как ожидалось, потому что тогда компилятор уберёт чтение значения переменной flag из тела цикла. Особенно хочется отметить, что память, занимаемая flag — самая обычная память. Эту переменную можно было бы даже сделать локальной. Оптимизировать или не оптимизировать чтение этой переменной, компилятор решает исходя из её типа.

Цитата Сообщение от ct0r Посмотреть сообщение
Потому что компилятору сложно понять, что же делает строка cout << "Сообщение" - там довольно нетривиальный код. Достаточно поменять этот вызов на вызов простой функции, и оптимизация пройдет.
Да, забыл дописать: когда я проверял тот код, я объявлял m и y как локальные в функции main. Поэтому вот это странно, потому что в функцию operator<< мы не передаём адреса m и у и мы не объявили их как volatile. Следовательно, operator<< не может изменить значения этих перемнных (без создания неопределённого поведения).
0
Evg
05.06.2015, 14:24

Не по теме:

Кстати, ct0r, всё правильно написал, volatile придумали вовсе не для синхронизации

0
196 / 197 / 120
Регистрация: 27.05.2011
Сообщений: 545
05.06.2015, 14:41
DrOffset, хорошо, согласен. Мой код с потоками не стоит так писать.
0
Игогошка!
 Аватар для ct0r
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
05.06.2015, 15:36
Цитата Сообщение от mymedia Посмотреть сообщение
Если запустить эти потоки одновременно, то функция do_something всё-таки будет вызвана. Однако если вы уберёте volatile, код отработает не так, как ожидалось
При стандартном значении слова volatile нет никаких гарантий того, что этот код будет работать. Поэтому дальнейшие рассуждения, почему код не будет работать, если volatile убрать, бессмысленны.

Цитата Сообщение от Evg Посмотреть сообщение
Соптимизирует ли компилятор два обращения из указателя p, который смотрит на const (хоть и volatile)?
Не должен. volatile говорит не оптимизировать разыменования, а const просто говорит о том, что лично я не собираюсь менять объект, а не то, что он не может изменяться.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
05.06.2015, 15:56
Цитата Сообщение от ct0r Посмотреть сообщение
const просто говорит о том, что лично я не собираюсь менять объект, а не то, что он не может изменяться
Ога. Но не все про это знают.Многие считают что const от слова "константа", а на самом деле правильно переводить как "немодифицируемый"
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.06.2015, 15:56

Тру настройка MVS2012
Всем привет! Хотел бы поинтересоваться следующим: Может ли кто-нибудь подсказать каким образом можно сделать хоткей на действие...

Кто Тру?
Дана задача ((x-1)(x-3)(x-5)...(x-63))/((x-2)(x-4)(x-6)...(x-64)) Взял одно решение из интернета, а второе написал сам. Можете сказать...

Только я знаю про тру наследование!
Это зависит от того, как использовать. Их можно использовать для выражения отношения &quot;является&quot;, а то что там в теории можно...

Правильное использование конструкции тру-финали
Как правильно? 1. var lst: TStringList; begin lst:= TStringList.Create; try lst.CommaText:=...

Нужно посоветоваться с тру фулстек-программистом
Думаю, из названия темы всё понятно. P.S. тема создана не в том разделе, администрация, перекиньте чуть-что туда - куда нужно ( я не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
сукцессия 22. От артефактов к физиологии: калибровка агентной модели грибной сукцессии для воспроизведения сезонной динамики и pH-плато
anaschu 11.07.2026
Аннотация В данной работе представлена калибровка агентной модели динамики грибных сообществ (fungal-succession), направленная на устранение нефизичных артефактов (коллапс биомассы, мгновенное. . .
Сукцессия 20. Война автоботов. Делаем ставки. Лёд против "пш-пш!".
anaschu 11.07.2026
Битва ИИ в ризосфере: Как мы скрестили жесткие ОДУ, закон Фика и «подземный шантаж» Уважаемые коллеги! Хочу поделиться уникальным опытом ведения междисциплинарной компьютерной разработки. Прямо. . .
Сукцессия 19. Какие выводы я сделал из модели? Часть 2.Внутримикоризный стехиометрический буфер и хроно-дискретные зоны экспансии
anaschu 11.07.2026
Био-Инженерный Ликбез: Архитектура Модели Ризосферы Математический аппарат моделирования
Сукцессия 18. Какие выводы я сделал из войны грибов с деревьями? Часть 1- рассказ и немного про термины
anaschu 11.07.2026
Био-Инженерный Ликбез: Архитектура Модели Ризосферы Математический аппарат моделирования Система ОДУ описывает динамику изменения массы различных компонентов системы во времени. Ключевой. . .
Просветление в 5 секунд
kumehtar 10.07.2026
Андрей Веретенников выдал фразу недавно: "Вам не обязательно кем-то себя считать"
Эксперимент с картинкой-обложкой на CodinGame
Adler 10.07.2026
Решил на днях провести эксперимент. У меня есть аккаунт на CodinGame, ТОП-3 по РФ среди 2200 участников (в разделе соревнования по программированию ИИ-ботов). Там есть обложка, куда можно влепить. . .
GitDOS: Когда я решил скрестить MS-DOS, GitHub и Claude
MaGz GoLd 08.07.2026
Привет, Киберфорум! Хочу поделиться своим проектом, который, надеюсь, вас заинтересует. GitDOS — это веб-приложение, которое позволяет запускать DOS в браузере с тремя крутыми фичами: диски живут в. . .
Учебный мини "цифровой двойник" = (Сервер = Java + Flask_питон )+(3D = Гугловскаая 4T nvideo + google colab) +( WMS = Odoo на Docker)
anaschu 07.07.2026
Увидел в требованиях к вакансии создателя имитационных моделей связку (REst + Api + WMS + Anylogic + питон + 3D Nvideo), и решил посмотреть, что это такое. Из этого всего я работал более менее. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru