Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 20 из 30

Тема: Помогите понять работу кода

  1. #1

    Помогите понять работу кода

    http://pastebin.com/PHFqFdqp

    Вот есть код.
    В режиме дебаг
    Вывод в окне такой.
    https://gyazo.com/c285a595d893196a47f8d673c4019e41
    Обратите внимания, что после какой-то операции значения переменных меняется.

    Как правильно в этомслучае нажно возвращать ссылку? VS2010 sp1
    Последний раз редактировалось Спалланцани; 17.11.2015 в 12:36.

  2. #2
    забанен навсегда
    Регистрация
    13.12.2011
    Сообщений
    4,325
    На пейстбин...

    «а лисички взяли спички, к морю синему пошли, море синее в говно...»

  3. #3
    Все рабозбрался. Но оставлю вдруг кому-то интересно.

    В общем можно смело переименовывать в "Задачу для скучающего с++ прогарммиста "И пусть решают)
    Последний раз редактировалось Спалланцани; 17.11.2015 в 13:00.

  4. #4
    забанен навсегда
    Регистрация
    13.12.2011
    Сообщений
    4,325
    Крестопроблемы

    «а лисички взяли спички, к морю синему пошли, море синее в говно...»

  5. #5
    Какой-то устаревший энтерпрайз, все давно уже перешли на раст
    5.11.17

  6. #6
    забанен навсегда Аватар для Konstantin.V
    Регистрация
    16.02.2014
    Сообщений
    0
    Цитата Сообщение от Спалланцани Посмотреть сообщение
    Все рабозбрался. Но оставлю вдруг кому-то интересно.

    В общем можно смело переименовывать в "Задачу для скучающего с++ прогарммиста "И пусть решают)
    Эээ... И щито, как ты думаешь, у тебя там было не так?

    https://ideone.com/2dBT3R

    Я не разбирался, чего ты хотел своим кодом достичь, но если я правильно понял проблему (что val1.x внезапно обнуляется), то после приведения твоего кода в компилябельное состояние -- не удодским Микрософтовским компиллером (нафига ты вообще пользуешься этим бажным говном ), а кошерным ГЦЦ -- он там нифига не обнуляется

    - - - Добавлено - - -

    (изменения ищи по тройному слешу: в начале строки -- то, что убрано; в конце -- что добвалено)

    - - - Добавлено - - -

    А, лол, M$-компиллер тебе там ссылку на стек запомнил, штоле? Гы. Ссылки -- одна из причин, почему критический код принято писать на чистых Сях, да
    Последний раз редактировалось Konstantin.V; 17.11.2015 в 20:39.

  7. #7
    забанен навсегда
    Регистрация
    13.12.2011
    Сообщений
    4,325
    Цитата Сообщение от Konstantin.V Посмотреть сообщение
    А, лол, M$-компиллер тебе там ссылку на стек запомнил, штоле? Гы. Ссылки -- одна из причин, почему критический код принято писать на чистых Сях, да
    Вот в C# вроде бы ссылки... А ничо не обнуляется

    «а лисички взяли спички, к морю синему пошли, море синее в говно...»

  8. #8
    Активный участник Аватар для fraps12
    Регистрация
    07.07.2010
    Сообщений
    977
    чем вам вижуалка не нравится

    каждый раз, когда я думаю, что видел дно ада, снизу стучат с криками "слава украине!"©real_ktulhu

    "Раз-два-три:попа Укропа,загори"©vintorez

  9. #9
    Цитата Сообщение от Konstantin.V Посмотреть сообщение
    Эээ... И щито, как ты думаешь, у тебя там было не так?
    std::make_pair(index, values[index]);

    Он понимает что нужно создать шаблон типа std:air<u32, BV>(index, values[index]); потому что именно эти типы я в него и подал.

    То есть проблема решается тем что писать надо было не makepair
    А я хочу на выходе получить std:air<u32, BV&> то есть ссылку на БВ. В итоге он создал временный объект куда положил не ссылку на элемент массива а сам элемент. И val1.x получается ссылается на временный элемент в памяти. время жизни которого ни чем не определено когда перепишется тогда и ок.
    А у меня есть смутные воспоминания что в ДЕБАГ версии сборки он автоматом обнуляет переменные а не мусор там оставляет. И по этому обнуление и идет.
    В релиз версии все как у тебя в gcc все работает.

    То есть ошибка в том что написали std::make_pair(index, values[index]);
    А надо было в явном виде написать std:air<u32, BV&>(index, values[index]);

    Смайлы это финишь.
    Последний раз редактировалось Спалланцани; 17.11.2015 в 22:02.

  10. #10
    забанен навсегда Аватар для Konstantin.V
    Регистрация
    16.02.2014
    Сообщений
    0
    Цитата Сообщение от fraps12 Посмотреть сообщение
    чем вам вижуалка не нравится
    Тем же, чем и Винда: бажная, шо песец, и везде <strike>особый русский путь</strike> особое микрософтовское видение, как всё должно быть

    - - - Добавлено - - -

    Цитата Сообщение от Спалланцани Посмотреть сообщение
    И val1.x получается ссылается на временный элемент в памяти. время жизни которого ни чем не определено когда перепишется тогда и ок.
    А у меня есть смутные воспоминания что в ДЕБАГ версии сборки он автоматом обнуляет переменные а не мусор там оставляет. И по этому обнуление и идет.
    В релиз версии все как у тебя в gcc все работает.
    Время жизни на стеке прекрасно определено -- до выхода за scope, дальше перетирается по мере использования стека. Но не помню, чтобы где-то слышал, чтобы стек обнулялся. Только если при участии каких-нибудь специальных инструментаторов кода. В твоем случае я бы скорее предположил, что в дебажном варианте ссылка затирается выкладыванием параметров на стек во время вызова второго printf-а. Если я правильно помню, что участок стека отхватывается сразу на блок, а не по мере объявления переменных, то прямо вторым параметром (val2._x) и затирается. А отличие в релизе, можно предположить, вызвано инлайнами вызовов, отчего ссылка получается на локальную переменную в теле TestAll
    Последний раз редактировалось Konstantin.V; 17.11.2015 в 23:04.

  11. #11
    Цитата Сообщение от Konstantin.V Посмотреть сообщение
    Время жизни на стеке прекрасно определено --
    Я имею ввиду через сколько времени информация лежащая там затрется. Не верно выразился.

  12. #12
    забанен навсегда Аватар для Konstantin.V
    Регистрация
    16.02.2014
    Сообщений
    0
    Цитата Сообщение от Namynnuz Посмотреть сообщение
    Вот в C# вроде бы ссылки... А ничо не обнуляется
    Не ссылки, а указатели. Узри разницу

  13. #13
    Цитата Сообщение от Konstantin.V Посмотреть сообщение
    А отличие в релизе, можно предположить, вызвано инлайнами вызовов, отчего ссылка получается на локальную переменную в теле TestAll
    Ну да. Или оптимизатор кода выделяет память под локальные переменные не по мере их появления в коде а сразу при заход в функцию.

  14. #14
    забанен навсегда Аватар для Konstantin.V
    Регистрация
    16.02.2014
    Сообщений
    0
    Цитата Сообщение от Спалланцани Посмотреть сообщение
    Ну да. Или оптимизатор кода выделяет память под локальные переменные не по мере их появления в коде а сразу при заход в функцию.
    Ох, давненько я не брал в руки шашек. В смысле, сиплюсплюшек. Уже лет 10 скоро Но начинаю что-то смутно припоминать, что память на стеке хватается сразу по максимуму, который может понадобиться во время работы всей функции/метода (под максимальный размер одновременно живущих локальных переменных), стек-поинтер указывает на самый ее низ (стек растет вниз), а параметры для вызовов кладутся строго под него. IIRC. Ну, т.е., на интелловских архитектурах, а то вообще всякое бывает.

    - - - Добавлено - - -

    Цитата Сообщение от Konstantin.V Посмотреть сообщение
    параметры для вызовов кладутся строго под него
    Блин, а если у тебя vararg? Хмм. Вызываемая функция может сразу выйти, не разбираясь, сколько ей параметров дали. Значит, SP должен, видимо, указывать на конец занятой памяти, включая параметры... Фак, всё забыл
    Последний раз редактировалось Konstantin.V; 17.11.2015 в 23:18.

  15. #15
    госпаде зачем с? пишите на C# там хоть понятно что написал

  16. #16
    Цитата Сообщение от Nuclear.net Посмотреть сообщение
    госпаде зачем с? пишите на C# там хоть понятно что написал
    Как в С# выделить выделнную по 32 разряда память?

  17. #17
    забанен навсегда
    Регистрация
    13.12.2011
    Сообщений
    4,325
    Цитата Сообщение от Konstantin.V Посмотреть сообщение
    Не ссылки, а указатели. Узри разницу
    Нужны указатели? Будут тебе указатели.
    Цитата Сообщение от Спалланцани Посмотреть сообщение
    Как в С# выделить выделнную по 32 разряда память?
    Во-первых, зачем? А во-вторых, если тебе это прямо жизненно необходимо: https://msdn.microsoft.com/en-us/library/s69bkh17.aspx

    «а лисички взяли спички, к морю синему пошли, море синее в говно...»

  18. #18
    Цитата Сообщение от Namynnuz Посмотреть сообщение
    Во-первых, зачем?
    Ну SSE регистры требуют указатель именно на выравненную память.

    А во-вторых, если тебе это прямо жизненно необходимо: https://msdn.microsoft.com/en-us/library/s69bkh17.aspx
    Спасибо.

    - - - Добавлено - - -

    Namynnuz,
    Это первый стандартный вопрос. Второй мой стандартный вопрос. Это а как сделать так, чтобы стандартные типы контейнеров могли хранить выравненную память. И что для этого прийдеться менять.
    Третий вопрос, а как гарантировать на этапе компиляции чтобы объект который должен быть выравненным случайно не выделился не выравненным.

    Вот если бы я знал ответы на все эти вопросы на c# я бы подумал. Причем я не сомневаюсь что они есть. Просто я понимаю сколько я угрохаю, чтобы это самому разобраться.

    А на С++ для меня это просто и понятно.
    Последний раз редактировалось Спалланцани; 17.11.2015 в 23:58.

  19. #19
    забанен навсегда
    Регистрация
    13.12.2011
    Сообщений
    4,325
    Цитата Сообщение от Спалланцани Посмотреть сообщение
    Ну SSE регистры требуют указатель именно на выравненную память.
    Как бы... http://blogs.msdn.com/b/dotnet/archi...g-married.aspx
    А ещё есть библиотеки... http://docs.yeppp.info/cs/_cpu_info_8cs-example.html

    В конце концов, есть уже целые математические фреймворки на C/C++ под это дело...

    «а лисички взяли спички, к морю синему пошли, море синее в говно...»

  20. #20
    забанен навсегда Аватар для Konstantin.V
    Регистрация
    16.02.2014
    Сообщений
    0
    А вообще, было бы забавно исследовать, как разные оптимизаторы обрабатывают такой случай -- случай ссылок на заведомо невалидную память. Что они считают себя в праве с такими вещами делать. Теоретически, может выясниться что-нибуть интересное. На какой-нибудь курсовик вполне может потянуть

Страница 1 из 2 12 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Конвертация кода из С++ в Pascal
    от Krevetka в разделе Софт
    Ответов: 26
    Последнее сообщение: 25.01.2018, 19:55
  2. Ответов: 42
    Последнее сообщение: 28.04.2012, 01:45
  3. Помогите понять PvZ!
    от boogie в разделе Протоссы
    Ответов: 36
    Последнее сообщение: 23.12.2011, 18:08
  4. Помогите понять смысл анекдота >___<
    от Hells012 в разделе Юмор
    Ответов: 31
    Последнее сообщение: 14.05.2011, 18:10

Ваши права

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