2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу Пред.  1, 2, 3, 4
 
 Re: true(204) в C++ что за зверь?
Сообщение17.11.2022, 14:06 
Аватара пользователя


05/06/08
478
TheRuinedMap в сообщении #1570214 писал(а):

Другой интересный пример - опять же для Clang - иллюстрирует другое характерное явление: языки С и С++ не гарантируют стабильности неинициализированного значения. То есть, вопреки ожиданиям некоторых детерминистически настроенных участников форума, значение неинициализированной переменной имеет право меняться само по себе


Смотря что вы подразумеваете под инициализацией. Современные компиляторы выделяют память под переменную практически сразу перед первым присвоением, и это будет инициализацией.Просто компилятов вычищает объект на какой-то стадии, если понимает, что он никак не может использоваться. Чуть сложнее с массивами памяти.
Что до флуктуаций значений, пока переменная не получила своего первого значения, байты находятся в вируальной карте адресов. То есть под них динамически выделяется память, которая до этого высвобождается другими процессами.

-- Чт ноя 17, 2022 15:26:00 --

photon в сообщении #1570115 писал(а):
MGM в сообщении #1570100 писал(а):
Была ошибка в коде.
Неудивительно, что ее не могли обнаружить другие, учитывая то, как вы приводили свой код, типа
MGM в сообщении #1570085 писал(а):
Код:
for(int st =0; st < N; st++){
funk1(st,....);
funk2(st, ...);
[b]funkBag(st,...);[/b]
}

На будущее:
1) Внятной помощи вы добъетесь гораздо быстрее, если будете приводить минимальный воспроизводящий проблему код, в том виде, в котором вы его компилируете, - Ctrl+C - Ctrl+V, без многоточий и прочих коррекций.
2) Будет удобнее, если для оформления больших фрагментов кода, использовать тег syntax, а не code.

1) Я понимаю, что мои вопросы и код производят впечатление творения начинающего ламера. На физ-факе меня учили решать волновые уравнения с карандашиком в руках и изучаемого Алгола я не знал от слова совсем. Мои первые работающие программы были написаны на ассемблере Z80 и PDP11. Однако, поверьте мне на слово, я алгоритмист самого высокого уровня с публикациями в топовых журналах по теме computer science artificial intelligence. Поэтому понять как работают мои алгоритмы в конкретной реализации с многоуровневыми структурами вложения не так-то и просто. Тем более, что сам алгоритм работал и работает, как часы, а фрагмент, в которым возник сбой чисто иллюстративный, написанный для себя. Хочу понять на уровне математики, действительно ли работа алгоритма ограничена лишь временем, или существует теоретический предел. Точнее наоборот. Уверен, что только временем, но не могу это доказать.
2) Спасибо. Учту на будущее.

 Профиль  
                  
 
 Re: true(204) в C++ что за зверь?
Сообщение17.11.2022, 14:37 
Аватара пользователя


28/10/21
100
MGM в сообщении #1570282 писал(а):
Смотря что вы подразумеваете под инициализацией. Современные компиляторы выделяют память под переменную практически сразу перед первым присвоением, и это будет инициализацией.


Нет, конечно. Никакого выделения памяти "сразу перед первым присвоением компиляторы не делают". И, разумеется, выделение памяти не имеет никакого отношения к инициализации - это совершенно разные понятия.

MGM в сообщении #1570282 писал(а):
Что до флуктуаций значений, пока переменная не получила своего первого значения, байты находятся в вируальной карте адресов. То есть под них динамически выделяется память, которая до этого высвобождается другими процессами.


Нет, конечно же. Никакого отношения к "виртуальной карте адресов" или "другим процессам" это явление не имеет.

В данном примере, например, компилятор Clang перед первым вызовом вообще не обращается содержимому памяти: он хочет передать в первый вызов непосредственно инициализационное значение, а раз его нет - то передает "мусор".

А вот во второй вызов он таки передает содержимое памяти - то есть другой "мусор".

То есть никакой фактической флуктуации значения переменной здесь нет, а есть лишь особенности кодогенерации оптимизирующего компилятора. Что всегда является основным источником разнообразных "магических" проявлений неопределенного поведения

Как это было и с вашим true(204).

 Профиль  
                  
 
 Re: true(204) в C++ что за зверь?
Сообщение17.11.2022, 14:58 


14/01/11
3062
MGM в сообщении #1570282 писал(а):
Тем более, что сам алгоритм работал и работает, как часы, а фрагмент, в которым возник сбой чисто иллюстративный, написанный для себя.

Тем не менее установить причину ошибочного поведения полезно, тем более, что на коротком примере это сделать проще. Попробуйте прогнать ваш код через статический анализатор кода, например, cppcheck, который вроде как вылавливает в том числе неинициализированные переменные.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 48 ]  На страницу Пред.  1, 2, 3, 4

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group