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
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
Red Devil
  опции профиля:
сообщение 21.7.2008, 16:54
Сообщение #2


Студент
*

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

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




Репутация:   3  


Цитата
if (++i > k)
goto 1branch
else
goto 2branch
Language: cpp


if (i++ > k)
goto 1branch
else
goto 2branch

Этот пример не удачный, т.к. тут выполняются разные по семантике задачи.


Цитата(Litkevich Yuriy @ 21.7.2008, 11:43) *
я говорил о вменяемом компиляторе, но не бесплатном, в IAR разницы ни какой, я давно про эту особенность Си прочитал, и смотрел результат работы разных компиллеров. в HiTech и IAR нет разницы, просто люди умеют писать оптимизирующие копиллеры. А GNU это бесплатный компиллер, с минимально возможной оптимизацией, как там прочие поживают не в курсе.

Так я про это и говорю, что для GNU компилеров делается и это нужно учитывать.

Цитата(AD @ 21.7.2008, 11:01) *
Для целочисленного типа и простых итераторах для современных компиляторов разницы не будет, насколько я знаю от программистов, которые делают встроенное ПО для авиации! Я еще только учусь на такого программиста, но встроенное ПО пока что не доверяют.

Для итераторов есть и очень существенная, при случае скажи об этом вашем программистам и еще книги посоветуй им почитать про стандартную библиотеку, раз таких основ не знают. Могут так же посмотреть исходные коды STL и подумать, почему там написано так и именно так, и никак иначе.
Вот пример, как генерируется код для типов, у которых определены собственные инкрементные операторы ++ (и для итераторов тоже, вне зависимости от компилятора).
Вот такой код генерируются для ++a; (69 строк)
    .file    "main.cpp"
    .text
    .align 2
.globl main
    .type    main, @function
main:
.LFB8:
    pushl    %ebp
.LCFI0:
    movl    %esp, %ebp
.LCFI1:
    subl    $8, %esp
.LCFI2:
    andl    $-16, %esp
    movl    $0, %eax
    subl    %eax, %esp
    subl    $8, %esp
    pushl    $0
    leal    -4(%ebp), %eax
    pushl    %eax
.LCFI3:
    call    _ZN1AC1Ei
    addl    $16, %esp
    subl    $12, %esp
    leal    -4(%ebp), %eax
    pushl    %eax
    call    _ZN1AppEv
    addl    $16, %esp
    movl    $0, %eax
    leave
    ret
.LFE8:
    .size    main, .-main
    .section    .gnu.linkonce.t._ZN1AC1Ei,"ax",@progbits
    .align 2
    .weak    _ZN1AC1Ei
    .type    _ZN1AC1Ei, @function
_ZN1AC1Ei:
.LFB9:
    pushl    %ebp
.LCFI4:
    movl    %esp, %ebp
.LCFI5:
    movl    8(%ebp), %edx
    movl    12(%ebp), %eax
    movl    %eax, (%edx)
    popl    %ebp
    ret
.LFE9:
    .size    _ZN1AC1Ei, .-_ZN1AC1Ei
    .section    .gnu.linkonce.t._ZN1AppEv,"ax",@progbits
    .align 2
    .weak    _ZN1AppEv
    .type    _ZN1AppEv, @function
_ZN1AppEv:
.LFB10:
    pushl    %ebp
.LCFI6:
    movl    %esp, %ebp
.LCFI7:
    movl    8(%ebp), %eax
    incl    (%eax)
    movl    8(%ebp), %eax
    popl    %ebp
    ret
.LFE10:
    .size    _ZN1AppEv, .-_ZN1AppEv
    .section    .note.GNU-stack,"",@progbits
    .ident    "GCC: (GNU) 3.3.4"


А вот такой код для a++ (101 строка)
    .file    "main.cpp"
    .text
    .align 2
.globl main
    .type    main, @function
main:
.LFB8:
    pushl    %ebp
.LCFI0:
    movl    %esp, %ebp
.LCFI1:
    subl    $8, %esp
.LCFI2:
    andl    $-16, %esp
    movl    $0, %eax
    subl    %eax, %esp
    subl    $8, %esp
    pushl    $0
    leal    -4(%ebp), %eax
    pushl    %eax
.LCFI3:
    call    _ZN1AC1Ei
    addl    $16, %esp
    leal    -8(%ebp), %edx
    subl    $4, %esp
    pushl    $0
    leal    -4(%ebp), %eax
    pushl    %eax
    pushl    %edx
    call    _ZN1AppEi
    addl    $12, %esp
    movl    $0, %eax
    leave
    ret
.LFE8:
    .size    main, .-main
    .section    .gnu.linkonce.t._ZN1AC1Ei,"ax",@progbits
    .align 2
    .weak    _ZN1AC1Ei
    .type    _ZN1AC1Ei, @function
_ZN1AC1Ei:
.LFB9:
    pushl    %ebp
.LCFI4:
    movl    %esp, %ebp
.LCFI5:
    movl    8(%ebp), %edx
    movl    12(%ebp), %eax
    movl    %eax, (%edx)
    popl    %ebp
    ret
.LFE9:
    .size    _ZN1AC1Ei, .-_ZN1AC1Ei
    .section    .gnu.linkonce.t._ZN1AppEi,"ax",@progbits
    .align 2
    .weak    _ZN1AppEi
    .type    _ZN1AppEi, @function
_ZN1AppEi:
.LFB10:
    pushl    %ebp
.LCFI6:
    movl    %esp, %ebp
.LCFI7:
    pushl    %ebx
.LCFI8:
    subl    $4, %esp
.LCFI9:
    movl    8(%ebp), %ebx
    movl    12(%ebp), %eax
    movl    (%eax), %eax
    movl    %eax, (%ebx)
    subl    $12, %esp
    pushl    12(%ebp)
.LCFI10:
    call    _ZN1AppEv
    addl    $16, %esp
    movl    %ebx, %eax
    movl    -4(%ebp), %ebx
    leave
    ret    $4
.LFE10:
    .size    _ZN1AppEi, .-_ZN1AppEi
    .section    .gnu.linkonce.t._ZN1AppEv,"ax",@progbits
    .align 2
    .weak    _ZN1AppEv
    .type    _ZN1AppEv, @function
_ZN1AppEv:
.LFB11:
    pushl    %ebp
.LCFI11:
    movl    %esp, %ebp
.LCFI12:
    movl    8(%ebp), %eax
    incl    (%eax)
    movl    8(%ebp), %eax
    popl    %ebp
    ret
.LFE11:
    .size    _ZN1AppEv, .-_ZN1AppEv
    .section    .note.GNU-stack,"",@progbits
    .ident    "GCC: (GNU) 3.3.4"


Вот код на С++, который тестировался :
class A
{
public:
    A(int val) : m_val(val) {}
    A & operator ++ ()    
    {
    ++m_val;
    return *this;
    }
    
    A operator ++(int)
    {
    A temp(*this);
    ++*this;
    return temp;
    }
    
    int m_val;
};

int main()
{
    A a(0);
    
    a++;
    //++a;
    
    return 0;
}


Сообщение отредактировал Red Devil - 21.7.2008, 16:59
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 21.7.2008, 18:14
Сообщение #3


Профессионал
*****

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

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




Репутация:   17  


Цитата
Для итераторов есть и очень существенная, при случае скажи об этом вашем программистам и еще книги посоветуй им почитать про стандартную библиотеку, раз таких основ не знают. Могут так же посмотреть исходные коды STL и подумать, почему там написано так и именно так, и никак иначе.

Приколист, однако! :) Вообще-то они и проверяли. STL во встроенном ПО не используется в целях надежности. Для современных компиляторов эта разница по барабану. А стандартные итераторы, как я их понял, это далеко не те, что в stl!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме
- 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


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


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




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