crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> i++ против ++i, спор однако
Red Devil
  опции профиля:
сообщение 20.7.2008, 11:27
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 68
Регистрация: 6.6.2008
Из: Saint-Petersburg
Пользователь №: 194

Спасибо сказали: 1 раз(а)




Репутация:   3  


Я согласен с автором в том, что опен соурс программисты слишком непрофиссионально относятся к работе. В большенстве своем пишут на Си, те кто пишут на С++ используют его неправильно.
Стоит хотя бы исходные коды посмотреть, ужас, ужас. Естественно все будет тормозить, когда циклы не оптимизируется, пишется i++, вместо ++i, функция вызыова размерности вызывается каждый при проходе цикла, вместо того чтобы ее сохранить при начале проходе и сравнивать значение. Лишние переменные с неопределенными сроком жизни, отсуствие применения паттернов проектирования - это я его могу продолжать еще долго. Привычка пихать все в классы, ничего не разделяя. На первый взгляд кажется что типа это дело автора опен соурс, но это напрямую влияет на архитуктуру проекта и того кто будет в дальшнейшем его развивать. Большенство проектов умирают, потому что никто не хочет поддерживать тот убогий код, который был заложен автором при разработке, в том числе и сам автор.
Статью читал где-то месяц назад, про программистов во всем согласен, что там написано.

Сообщение отредактировал Red Devil - 20.7.2008, 11:29
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
Tonal
  опции профиля:
сообщение 22.7.2008, 21:25
Сообщение #2


Активный участник
***

Группа: Участник
Сообщений: 452
Регистрация: 6.12.2007
Из: Новосибирск
Пользователь №: 34

Спасибо сказали: 69 раз(а)




Репутация:   17  


Не совсем так. Для твоего примера, нормальный современный компилятор, сообразит, что возвращаемое значение не используется - значит его можно выкинуть. Естественно, это в случае, когда включена хоть какая-то оптимизация.
struct A {
  A() : m_val(0) {}
  A(int val) : m_val(val) {}
  A & operator ++ () {
    ++m_val;
    return *this;
  }
  
  A operator ++(int) {
    A temp(*this);
    ++*this;
    return temp;
  }
  bool operator ==(const A& x) {
    return m_val == x.m_val;
  }
  bool operator !=(const A& x) {
    return m_val != x.m_val;
  }

  private:  
    int m_val;
};

int f1(A cur, const A& end) {
  int r = 0;
  for (; cur != end; ++cur)
    ++r;
  return r;
}

int f2(A cur, const A& end) {
  int r = 0;
  for (; cur != end; cur++)
    ++r;
  return r;
}

g++ (GCC) 3.4.5 (mingw-vista special r3)
>g++ -S -O1 iter.cpp
    .file    "iter.cpp"
    .text
    .align 2
.globl __Z2f11ARKS_
    .def    __Z2f11ARKS_;    .scl    2;    .type    32;    .endef
__Z2f11ARKS_:
    pushl    %ebp
    movl    %esp, %ebp
    pushl    %ebx
    movl    12(%ebp), %ebx
    movl    $0, %ecx
    movl    8(%ebp), %eax
    movl    %eax, %edx
    cmpl    (%ebx), %eax
    je    L9
L7:
    incl    %ecx
    leal    1(%edx), %eax
    movl    %eax, %edx
    cmpl    (%ebx), %eax
    jne    L7
    movl    %eax, 8(%ebp)
L9:
    movl    %ecx, %eax
    popl    %ebx
    popl    %ebp
    ret
    .align 2
.globl __Z2f21ARKS_
    .def    __Z2f21ARKS_;    .scl    2;    .type    32;    .endef
__Z2f21ARKS_:
    pushl    %ebp
    movl    %esp, %ebp
    pushl    %ebx
    movl    12(%ebp), %ebx
    movl    $0, %ecx
    movl    8(%ebp), %eax
    movl    %eax, %edx
    cmpl    (%ebx), %eax
    je    L20
L18:
    incl    %ecx
    leal    1(%edx), %eax
    movl    %eax, %edx
    cmpl    (%ebx), %eax
    jne    L18
    movl    %eax, 8(%ebp)
L20:
    movl    %ecx, %eax
    popl    %ebx
    popl    %ebp
    ret

Как можно убедиться, код обоих функций одинаков.
Для других уровней оптимизации и последующих версий gcc это тоже верно.

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

Сообщение отредактировал Tonal - 22.7.2008, 21:29
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме
- Red Devil   i++ против ++i   20.7.2008, 11:27
- - Litkevich Yuriy   Цитата(Red Devil @ 20.7.2008, 15:27) пише...   20.7.2008, 15:53
- - Red Devil   Цитата(Litkevich Yuriy @ 20.7.2008, 16:53...   20.7.2008, 17:13
- - Litkevich Yuriy   по опыту написания программ на ассемблере для конт...   20.7.2008, 17:22
- - void*   Цитата(Litkevich Yuriy @ 20.7.2008, 15:53...   21.7.2008, 8:56
- - Red Devil   Помимо этого в первом случае возращается ссылка, а...   21.7.2008, 10:53
|- - AD   ЦитатаПомимо этого в первом случае возращается ссы...   21.7.2008, 11:01
- - Litkevich Yuriy   я говорил о вменяемом компиляторе, но не бесплатно...   21.7.2008, 11:43
- - Сафи   Вот вас понесло...   21.7.2008, 11:46
- - Litkevich Yuriy   для первого варианта псевдо ассемблер так выглядит...   21.7.2008, 12:03
- - Red Devil   Цитатаif (++i > k) goto 1branch else goto...   21.7.2008, 16:54
|- - AD   ЦитатаДля итераторов есть и очень существенная, пр...   21.7.2008, 18:14
- - void*   Цитата(AD @ 21.7.2008, 18:14) STL во встр...   21.7.2008, 18:43
|- - AD   Цитата(void* @ 21.7.2008, 19:43) прикольн...   21.7.2008, 19:40
- - Litkevich Yuriy   во встроенном ПО стандартных библиотек избегают по...   21.7.2008, 19:42
|- - AD   Цитата(Litkevich Yuriy @ 21.7.2008, 20:42...   21.7.2008, 19:44
- - Litkevich Yuriy   Цитата(AD @ 21.7.2008, 23:44) Ее боятся П...   21.7.2008, 19:51
- - Novak   Цитата(Red Devil @ 21.7.2008, 17:54) Этот...   22.7.2008, 5:25
- - void*   Цитата(Novak @ 22.7.2008, 5:25) Нормальны...   22.7.2008, 9:05
- - Red Devil   Цитата(Novak @ 22.7.2008, 5:25) Нормальны...   22.7.2008, 13:56
- - Andrew Selivanov   Рискуя нарваться на крики негодования, но все же: ...   22.7.2008, 15:09
- - Litkevich Yuriy   RE: i++ против ++i   22.7.2008, 15:14
|- - AD   Andrew Selivanov, логично!   22.7.2008, 15:25
- - Tonal   Не совсем так. Для твоего примера, нормальный совр...   22.7.2008, 21:25
- - Red Devil   Цитата(Andrew Selivanov @ 22.7.2008, 16:0...   23.7.2008, 7:34
|- - Tonal   Цитата(Red Devil @ 23.7.2008, 11:34) Цита...   23.7.2008, 11:10
- - ЙаМайскЫйПчОЛ   Посвящается вечному спору) Инкремент постфиксный(i...   23.7.2008, 9:16
|- - AD   Цитата(ЙаМайскЫйПчОЛ @ 23.7.2008, 10:16) ...   23.7.2008, 9:39
- - ЙаМайскЫйПчОЛ   Цитата(AD @ 23.7.2008, 10:39) Про статику...   23.7.2008, 9:59
|- - AD   Цитата(ЙаМайскЫйПчОЛ @ 23.7.2008, 10:59) ...   23.7.2008, 10:13
- - Litkevich Yuriy   Цитата(ЙаМайскЫйПчОЛ @ 23.7.2008, 13:16) ...   23.7.2008, 12:06
- - ЙаМайскЫйПчОЛ   кстати, забыл сказать, что использование цикла for...   23.7.2008, 12:11
- - Litkevich Yuriy   Цитата(ЙаМайскЫйПчОЛ @ 23.7.2008, 16:11) ...   23.7.2008, 12:16
- - ЙаМайскЫйПчОЛ   Litkevich Yuriy, В чем вопрос? Ты все правильно ра...   23.7.2008, 12:20
- - void*   Цитата(ЙаМайскЫйПчОЛ @ 23.7.2008, 12:11) ...   23.7.2008, 12:50


Ответить в данную темуНачать новую тему
Теги
Нет тегов для показа


4 чел. читают эту тему (гостей: 4, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 28.12.2024, 10:29