На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела:
1. Название темы - краткое описание кто/что против кого/чего
2. В первом сообщении - список параметров, по которым идет сравнение.
3. Старайтесь аргументировать свои высказывания. Фразы типа "Венда/Слюникс - ацтой" считаются флудом.
4. Давайте жить дружно и не доводить обсуждение до маразма и личных оскорблений.
Модераторы: Модераторы, Комодераторы
Страницы: (29) « Первая ... 26 27 [28] 29   ( Перейти к последнему сообщению )  
> Вопрос к программистам на C , Исходники ядра Linux
    Ну, если ты враг народа, то давай писать макросами :yes:
      Цитата linuxfan @
      Разводишь меня чтоли? Там же не присваивание, а конструктор копирования. Такое можно (и нужно) оптимизировать. Ты мне соптимизируй a = b + c.

      Не развожу. Что тебе запустить уже лдень да?? Так вот.. если лень, то скажу так.. конструктор копирования не выполняеться.. 3 раза выполняется конструктор по умолчанию и ВСЕ!
        Цитата
        Там же не присваивание, а конструктор копирования

        :)
        обычно присваивание отличается от конструктора копирования только тем, что возвращает const A &.
        И то это делать необязательно, а лишь для ситуаций, когда нам хочется писать a = b = c;

        Добавлено
        (тфу ты блин, Неудачник опередил)
          Цитата BugHunter @
          обычно присваивание отличается от конструктора копирования только тем, что возвращает const A &.

          у присвоения A& возвращается...
          int a,b,c;
          (a = b) = c;

          Добавлено
          linuxfan
          На вот тебе такой код.. а то подумаеш еще что там operator= вызовется..
          ExpandedWrap disabled
            class A
               {
               public:
                  A() {std::cout << "def\n";}
                  A(const A&) {std::cout << "copy\n";}
             
                  A operator+ (const A&)
                     {
                     return A();
                     }
                  A& operator= (const A&)
                     {
                     std::cout << "=\n";
                     return *this;
                     }
               };
             
            int main()
               {
               A a1,a2;
               A a3 = a1 + a2;
               }


          Добавлено
          Цитата linuxfan @
          Лень :P Или ты не веришь, что можно написать qsort макросом?

          Верю. Но я бы не хотел пользоваться программой(тем более ОС) в которой сортировка делается при помощи макроса.
          И более чем уверен что такое извращение в серъезных проектах не используют.
            LuckLess, видимо ты меня не понимаешь: я тебе внушаю, что оверхед именно на копировании при '+' вызывается.
            ExpandedWrap disabled
              #include <iostream>
               
              class A
              {
                  public:
                      static bool silent;
                      A() {if (!silent) std::cout << "def\n";}
                      A(const A&) {if (!silent) std::cout << "copy\n";}
               
                      const A operator+ (const A &arg)
                      {
                          A res;
                          if (!silent) std::cout << "operator +\n";
                          return res;
                      }
                      A& operator= (const A&) {
                          if (!silent) std::cout << "operator = \n";
                          return *this;
                      }
              };
               
              bool A::silent = true;
               
              int main()
              {
                  A a1,a2;
                  A a3;
                  A::silent = false;
                  std::cout << "First pass\n";
                  a3 = a1 + a2;
                  std::cout << "Second pass\n";
                  a3 = a1 + a2;
                  return 0;
              }

            Вот результат от gcc:
            ExpandedWrap disabled
              First pass
              def
              operator +
              operator =
              Second pass
              def
              operator +
              operator =

            Вот тебе и оверхед: Два временных объекта, потому что operator + . Или ты думаешь, что написал изотерическое сложение гипотетического хрена с несуществующей редькой и доказал высокую эффективность C++?
            Цитата LuckLess @
            И более чем уверен что такое извращение в серъезных проектах не используют.

            Конечно нет. Но ведь можно же.

            Добавлено
            В серьезных проектах макросы иногда используют, чтобы избежать копипаста.
              Цитата linuxfan @
              Вот тебе и оверхед: Два временных объекта, потому что operator + .

              подругому сделать нельзя никак. оверхеда тут нет, так как оверхед == лишнее действие, а тут лишнего ничего нет.
              хочеш подругому - использую функции и ссылки или operator+=.

              Добавлено
              Цитата linuxfan @
              я тебе внушаю, что оверхед именно на копировании при '+' вызывается.

              Я тебе дал пример с копированием.
              ты дал пример не с копированиема с присвоение.
                Цитата LuckLess @
                Я тебе дал пример с копированием.

                Ну пардон, если я некорректно выразился. Я-то имел ввиду именно присваивание при использовании бинарного оператора. Там оверхед в создании временного объекта для хранения результата операции. По уму бы хотелось так:
                ExpandedWrap disabled
                  ....
                  const A& operator +(const A& arg,A& res) {
                     /* складываем как-нибудь *this и arg, помещая значение в res */
                    return res;
                  }

                Но такая запись добавляет дополнительных хлопот по возможной очистке предварительной результата, но избегает создания временного объекта. пусть бы лучше компилер озабачивался выбором res: либо временный объект, либо сразу lvalue для рядомстоящего присваивания.
                  Цитата linuxfan @
                  либо временный объект, либо сразу lvalue для рядомстоящего присваивания.

                  Он и возвращает сразу lvalue для рядом стоящего присваиваня.
                  и это присваивание это лвалуе использует.

                  да, для присвоения и operator+ есть незначительный оверхед.
                  но кто использует большие обхекты с operator+ в связке??
                  ну тут дело рук опять в общем :D
                    Ну так это один из провалов идеологии C++. Импиративная парадигма с A& sum(const A&,const A&,A&) тут гораздо оптимальнее.
                    Надо пример объектов, для которых такое поведение operator+ проблема? std::string. Там неспроста с прокси-объектами и подсчетом ссылок заморачивались. Без gc с памятью при таком поведении операторов один геморрой (скажем спасибо boost::shared_ptr :))
                      Цитата linuxfan @
                      Ну так это один из провалов идеологии C++. Импиративная парадигма с A& sum(const A&,const A&,A&) тут гораздо оптимальнее.

                      никакой это не провал. для больших объектов это легко оптимизируется.
                      для маленьких незначительно. к примеру.
                      ExpandedWrap disabled
                        class BigObject
                           {
                           private:
                              bool temp;
                              std::vector<int> BigBuffer;
                           public:
                              BigObject () : temp(false){}
                              BigObject operator+ (const BigObject& obj)
                                 {
                                 BigObject tempObj(obj);
                                 //тут сложение.
                                 tempObj.temp = true;
                                 return tempObj;
                                 }
                              BigObject& operator= (BigObject& bf)
                                 {
                                 if (bf.temp)
                                    BigBuffer.swap (bf.BigBuffer);//очень быстро выполняется
                                 else
                                    BigBuffer.assign (bf.BigBuffer.begin(), bf.BigBuffer.end());//копирование данных
                                 }
                           };


                      и вообще. давай уже покажи где оверхед в СРАВНЕНИИ с С!
                      покажи код(а не надуманный пример) на С который сложно написать на С++ не потеряв в производительности.

                      Добавлено
                      вообще такого рода проблема - это не проблема С++ а проблема архитектуры в целом.
                      если бы возвращаемое значение передавалось не через регистр. а вместо этого в вункцию push-ился доп. параиетр с адремов того мета, куда надо вернуть значение, то былоб значительно оптимальней.
                        Цитата LuckLess @
                        в вункцию push-ился доп. параиетр с адремов того мета, куда надо вернуть значение, то былоб значительно оптимальней.

                        Именно так.
                        А пример сходу придумать сложно. Ведь в крайнем случае можно в C++ всегда написать точно так же как и в C. Или мы ограничиваемся чистым C++? :) Тогда прошу уточнить степень "чистоты" :)
                        Потому как есть некоторые нестандартизованные стандартом трюки (alloca, например -- в чистом C++ подобных вещей вообще нет), за счет которых "не совсем чистый" C может вырваться вперед.
                          Цитата linuxfan @
                          А пример сходу придумать сложно. Ведь в крайнем случае можно в C++ всегда написать точно так же как и в C.

                          Чистый С++ как и Чистый С(С99).
                          на С++ собстно будут использоватся STL и ООП в разумных ессесно пределах.
                          на С соответственно сруктурное программирование и сишная библиотека.
                            Ну на "чистом" языке проблематично реализовать что-либо отличное от примитивной однопоточной числодробилки, а на таких задачах я не вижу преимущества ни одного из языков.
                            Думаю, что очень сложно придумать такую демо-задачу.
                              Ну давай поиграемся с COM :D

                              Навай WinAPI + Чистый язык.
                                Я не знаю ни COM ни WinAPI :) Меня кормит Linux :)
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (29) « Первая ... 26 27 [28] 29 


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0691 ]   [ 15 queries used ]   [ Generated: 27.04.24, 07:24 GMT ]