На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела:
1. Название темы - краткое описание кто/что против кого/чего
2. В первом сообщении - список параметров, по которым идет сравнение.
3. Старайтесь аргументировать свои высказывания. Фразы типа "Венда/Слюникс - ацтой" считаются флудом.
4. Давайте жить дружно и не доводить обсуждение до маразма и личных оскорблений.
Модераторы: Модераторы, Комодераторы
Страницы: (5) [1] 2 3 ... Последняя » все  ( Перейти к последнему сообщению )  
> undefined/unspecified , точки следования, короче
    До сих пор не допилено в Стандарте, ИМХО. Особенно это "радует":

    ExpandedWrap disabled
      f(++i, ++i);       // undefined behavior until C++17, unspecified after C++17


    Это сообщение было перенесено сюда или объединено из темы "Текущий Стандарт С++ и перспективы его развития"
      Ну а что не так - низзя так рисовать, низзя. Как ни назови.

      Это сообщение было перенесено сюда или объединено из темы "Текущий Стандарт С++ и перспективы его развития"
        А отчего нельзя то? Если i вначале было равно 2, то первый должен пойти параметр 3, второй - 4, а потом вызов. То, что в стэк аргументы наоборот кладутся - проблема компилятора, а не синтаксиса с семантикой.

        Это сообщение было перенесено сюда или объединено из темы "Текущий Стандарт С++ и перспективы его развития"
          Цитата Славян @
          Если i вначале было равно 2, то первый должен пойти параметр 3, второй - 4, а потом вызов.
          С чего ты так решил? Написано же до C++17 это было undefined behavior, а начиная с C++17 - unspecified.
          То есть раньше компилятор мог в такой ситуации делать что бог на душу положит, причем каждый раз по-разному. Теперь он должен выбрать определённое поведение (не обязательно совпадающее с твоим мнением, и даже не обязательно разумное) и следовать ему. Он может передать пару значений 3, 4, как ты думаешь, или пару значений 4, 3, если вычисляет значения параметров в обратном порядке, или значения 3, 3, если имитирует параллельное вычисление аргументов, или значения 4 и 4, если сперва выполняет оба инкремента. Более того он может заносить в стек любые два значения на выбор разработчиков.

          Это сообщение было перенесено сюда или объединено из темы "Текущий Стандарт С++ и перспективы его развития"
            Да начхать же как сейчас работает компилятор! Код же написан, понимается человеком весьма просто и прямо: вызвать f, у коей первый аргумент 2++ (то бишь 3), а потом снова переменная++ (то бишь 4). Всё абсолютно чётко. Нет никаких параллельных вычислений!! Как записано, так пусть и считает! :angry:

            Это сообщение было перенесено сюда или объединено из темы "Текущий Стандарт С++ и перспективы его развития"
              Цитата Славян @
              Всё абсолютно чётко. Нет никаких параллельных вычислений!! Как записано, так пусть и считает! :angry:

              Точек следования нет + работа ведется с одной и той же областью памяти. Из за чего при оптимизации, могут возникнуть конфликты.
              Для обеспечения скорости, компилятор может переупорядочивать выражения по своему усмотрению во время оптимизации программы, что приводит к тому, что у тебя даже код программы может выполнятся не в том порядке, в каком он написан тобою.
              Предположим ты написал вот так:
              ExpandedWrap disabled
                int i = 2;
                f(++i, ++i);       // undefined behavior until C++17, unspecified after C++17

              И ожидаешь внутри функции получить первый аргумент равным - 3, и второй аргумент равным - 4.
              Но так как в этом выражении нет точек следования, компилятор в праве переупорядочить по своему усмотрению данную инструкцию, и ты можешь получить что то типа того:
              ExpandedWrap disabled
                f(i=4, i=3)

              Или например вообще вот такое:
              ExpandedWrap disabled
                f(i+1, i+1)
                {
                   i += 2;
                }

              Или еще что то другое.

              Это сообщение было перенесено сюда или объединено из темы "Текущий Стандарт С++ и перспективы его развития"
                Вот второе - не должно быть. Ибо префиксный оператор должен отработать до входа в функцию.
                А с первым - да, печально.

                Это сообщение было перенесено сюда или объединено из темы "Текущий Стандарт С++ и перспективы его развития"
                  Цитата JoeUser @
                  Вот второе - не должно быть. Ибо префиксный оператор должен отработать до входа в функцию.

                  Ну с этим возможно я погорячился, но я когда писал - старался донести саму идею, как оно вообще может преобразовать параметры функции, не особо заморачиваясь на работе конкретного оператора.

                  Добавлено
                  Цитата JoeUser @
                  Ибо префиксный оператор должен отработать до входа в функцию.

                  А если учесть именно вот это, то вообще можно получить вот такой результат:
                  ExpandedWrap disabled
                        int i = 2;
                        f(++i, ++i);       // undefined behavior until C++17, unspecified after C++17
                        {
                          param1 = 4;
                          param2 = 4;
                        }

                  Т.е. внутри функции оба аргумента будут равны 4. Мы ведь инкрементировали одну и ту же переменную, результат посчитался до тела функции. Как результат - Славян ожидает 3, 4, а на деле имеет 4, 4 - что более логично.

                  Это сообщение было перенесено сюда или объединено из темы "Текущий Стандарт С++ и перспективы его развития"
                    Цитата Wound @
                    а деле имеет 4, 4 - что более логично.

                    По идее - да!
                    Сперва инкремент, и только потом передача параметров.

                    Это сообщение было перенесено сюда или объединено из темы "Текущий Стандарт С++ и перспективы его развития"
                      Цитата Wound @
                      Точек следования нет + работа ведется с одной и той же областью памяти. Из за чего при оптимизации, могут возникнуть конфликты.
                      А) Годьте! Если только на этапе оптимизации, то это проблема недоделанного оптимизатора. Пусть осторожней работает! Если же не только, то давайте смотреть этот обыденный случай.
                      Б) Я не шибко улавливаю фразу "точка следования" (только путём общелогических умозаключений), так что расскажите попроще на этом простом примере, что тут не так? Всё же просто: вызов с двумя аргументами, кои записаны подряд, а значит и вычисляться должны подряд! Так что f(3,4);

                      Цитата Wound @
                      Для обеспечения скорости, компилятор может переупорядочивать выражения по своему усмотрению во время оптимизации программы, что приводит к тому, что у тебя даже код программы может выполнятся не в том порядке, в каком он написан тобою.
                      Ещё раз напомню, что шаманство компилятора при оптимизации - его изъян; пусть хуже оптимизирует, но не допускает ошибок/двузначностей.

                      Это сообщение было перенесено сюда или объединено из темы "Текущий Стандарт С++ и перспективы его развития"
                        Цитата Славян @
                        Я не шибко улавливаю фразу "точка следования" (только путём общелогических умозаключений)

                        Читать тут.

                        Это сообщение было перенесено сюда или объединено из темы "Текущий Стандарт С++ и перспективы его развития"
                          Это:
                          Цитата
                          Порядок вычисления операндов любого C++ оператора, включая порядок вычисления аргументов функции в выражении вызова функции, и порядок вычисления вложенных выражений внутри любого выражения, не определён
                          звучит как "считайте, как захочется". Чуть ли не аксиоматически=законодательно. Бред какой-то. Зачем так сделали?
                          Впрочем, тема обсуждения явно рвётся в холиварчики. :blush:

                          Добавлено
                          А-а-а-а! Дочитал ниже, и всё становится понятно! Школота малограмотная пишет же! Так надо:
                          Цитата
                          Точка следования, это точка последовательности выполнения, в которой все побочные эффекты от вычислений, стоящих раньше в последовательности, завершены, и никакие побочные эффекты, относящиеся к последующим вычислениям, не начали выполняться.
                          :facepalm: :facepalm: :facepalm:

                          Это сообщение было перенесено сюда или объединено из темы "Текущий Стандарт С++ и перспективы его развития"
                            Цитата Славян @
                            Я не шибко улавливаю фразу "точка следования"

                            Тынц. Правда, в новых стандартах, ЕМНИП, термина "точка следования" уже нет, но суть в значительной степени осталась прежней.

                            Цитата Славян @
                            так что расскажите попроще на этом простом примере, что тут не так? Всё же просто: вызов с двумя аргументами, кои записаны подряд, а значит и вычисляться должны подряд!
                            Собственно, выделенное и есть "не так".

                            Цитата Славян @
                            Ещё раз напомню, что шаманство компилятора при оптимизации - его изъян; пусть хуже оптимизирует, но не допускает ошибок/двузначностей.

                            UB, и как следствие - оптимизации, делающиеся в предположении, что он никогда не возникает - тоже изъян, как, например, тут?

                            Цитата Славян @
                            Бред какой-то. Зачем так сделали?

                            Полагаю, это связано с порядком передачи аргументов в функцию - на каких-то платформах она одна, на каких-то другая, и поэтому вычисление аргументов в порядке, не совпадающем с порядком передачи, приведёт к ненужному (хоть и небольшому) оверхеду.

                            Это сообщение было перенесено сюда или объединено из темы "Текущий Стандарт С++ и перспективы его развития"
                              Жертвовать логикой ради убирания "оверхеда"!?? Бред. Жесть. Идиотизм... :facepalm:

                              Это сообщение было перенесено сюда или объединено из темы "Текущий Стандарт С++ и перспективы его развития"
                                Цитата Славян @
                                Бред. Жесть. Идиотизм...

                                О да, это достойный аргумент против оверхеда, особенно в контексте языков С/C++, которые как раз от оверхеда и стараются избавиться :D
                                Да и где ты логику-то увидел? По-моему "порядок вычисления аргументов не определён" не менее логично, чем "строгий порядок слева направо".

                                Это сообщение было перенесено сюда или объединено из темы "Текущий Стандарт С++ и перспективы его развития"
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0457 ]   [ 16 queries used ]   [ Generated: 18.04.24, 06:21 GMT ]