Автор Тема: Трюки, приемы программирования  (Прочитано 23171 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Shymep

  • Администратор
  • Действительный статский советник
  • *****
  • Сообщений: 1909
  • Репутация: 58
  • Пол: Мужской
Трюки, приемы программирования
« : јРав 29, 2007, 05:24:14 pm »
Итак здесь обсуждаем свои идеи по поводу, что лучше, оптимальней итд...

1 вопрос: когда лучше дублировать часть стандартных функций, а когда лучше пользоваться уже готовыми библиотеками (http://forum.ishodniki.ru/index.php/topic,10648.msg43558/boardseen.html)

Мое мненние на этот счет:
1) Если нужно написать простое условие на проверку типа "а символ-число?", лучше самому набросать условие c>='0' && c<='9'
2) Если таких функций несколько, лучше имхо их продублировать у себя в программе, чем подключать модуль.

2 вопрос: всегда задавал себе и не находил ответа... Зачем в С++ для строк использовать функцию нахождения длины strlen в том случае, если идет цикл по всем символам строки
Код: (cpp) [Выделить]
for(i=0;i<strlen(s);i++){//...}Неоптимально!

Код: (cpp) [Выделить]
n = strlen(s);
for(i=0;i<n;i++){//...}
Уже лучше, сократили число обращений к функции strlen, но зачем, когда можно так

Код: (cpp) [Выделить]
for(i=0;s[i]!='\0';i++){//...}
« Последнее редактирование: јРав 29, 2007, 05:43:01 pm от Shymep »
Smile and the world will smile back :wink:

beholder

  • Гость
Re: Трюки, приемы программирования
« Ответ #1 : јРав 29, 2007, 06:02:33 pm »
Цитировать
Мое мненние на этот счет:
1) Если нужно написать простое условие на проверку типа "а символ-число?", лучше самому набросать условие c>='0' && c<='9'
2) Если таких функций несколько, лучше имхо их продублировать у себя в программе, чем подключать модуль.
безсмысленно, модуль со стандартными ф-ми работы с С подобными строками, достаточно мал и практически не ощутим в программе.
а вот модуль который действительно увеличит ехе, это iostream но я сомневаюсь, что кто то будет переписывать потоковые классы, у себя в программе:)
насчет strlen согласен, бесполезная ф-ия, но неизвестно на чем она писана..как и весь этот модуль, существует подозрение, что на асме, а если это так, то они будут работать быстрее чем  аналоги написанные собственноручно.

Оффлайн Shymep

  • Администратор
  • Действительный статский советник
  • *****
  • Сообщений: 1909
  • Репутация: 58
  • Пол: Мужской
Re: Трюки, приемы программирования
« Ответ #2 : јРав 29, 2007, 06:09:37 pm »
насчет strlen согласен, бесполезная ф-ия
Она небесполезная, если нужно просто вычислить длину строки. Хотя тогда опять-таки, если это единтсвенная функция из string.h, стоит ли ее подключать :)

В общем предлагаю задавать другие вопросы по практике программизма.
Smile and the world will smile back :wink:

Оффлайн melkiy

  • Глобальный модератор
  • Действительный статский советник
  • *****
  • Сообщений: 1124
  • Репутация: 24
  • Пол: Мужской
Re: Трюки, приемы программирования
« Ответ #3 : јРав 29, 2007, 09:07:23 pm »
Вот хотя бы в приведённом уже в этой теме коде: если всё равно, как инкрементировать переменную, не лучше ли ++i, чем i++ ?

Далее, может лучше просто
s[ i ], чем 
s[ i ] != '\0'

Ведь во втором случае сначала генерируется результат сравнения, который уже сравнивается с ИСТИНой, а в первом случае на этой операции экономим?
... Есть пауки, которые плетут ловчие сети, и есть пауки-бродяги. В любом случае они хЫщники.

agl

  • Гость
Re: Трюки, приемы программирования
« Ответ #4 : јРав 30, 2007, 12:00:28 am »
Цитировать
Вот хотя бы в приведённом уже в этой теме коде: если всё равно, как инкрементировать переменную, не лучше ли ++i, чем i++
Интересно, чем это лучше? Не думаю что есть разница в скорости, в данном случае все равно как, так я думаю.
Цитировать
Далее, может лучше просто
s[ i ], чем 
s[ i ] != '\0'
думаю твой вариант быстрее, т.к. сравнений вроде будет меньше, но подходит в основном для С, ну ещё для С++, и то насчёт нового компилера не уверенна. В С# с этим строго.
А как насчет такого изврата:
Код: (cpp) [Выделить]
for(i = 0; i < sizeof(ar)/sizeof(int); i++){ // code }помоему так)) я такими конструкциями не пользуюсь, т.к. смысла не вижу.
зачем вычеслять размер массива, когда мы его и так знать должны, неохота линки искать, но не один раз на форуме видела подобное.
Также считаю, если уж написали стандартные библиотеки, то зачем переписывать их без лишней нужды. ИМХО, когда пишем серьезный, ну или не очень серьезный, проект, библиотека по работе со строками не лишняя, поэтому стоит её(и не только) знать и уметь работать.  Для того и написано, чтобы нам не морочиться.

beholder

  • Гость
Re: Трюки, приемы программирования
« Ответ #5 : јРав 30, 2007, 05:10:25 pm »
Цитировать
Вот хотя бы в приведённом уже в этой теме коде: если всё равно, как инкрементировать переменную, не лучше ли ++i, чем i++ ?
это безразлично, я больше привык к постфиксной записи, кто-то к префиксной, тут уже дело вкуса :)

Оффлайн melkiy

  • Глобальный модератор
  • Действительный статский советник
  • *****
  • Сообщений: 1124
  • Репутация: 24
  • Пол: Мужской
Re: Трюки, приемы программирования
« Ответ #6 : јРав 30, 2007, 06:29:37 pm »
Это небезразлично: оператор постинкремента сохраняет старое значение переменной, потому что он обязан вернуть это старое значение. Прединктремент никаких доп. переменных не создаёт.
Другое дело, что при минимальной (опять же - какой именно?) оптимизации компилятор везде, где возможно, заменит вариант на более эффективный. Но стоит ли доверять эту работу компилятору, особенно если мы сами понимаем разницу.
... Есть пауки, которые плетут ловчие сети, и есть пауки-бродяги. В любом случае они хЫщники.

beholder

  • Гость
Re: Трюки, приемы программирования
« Ответ #7 : јРав 30, 2007, 07:09:34 pm »
Цитировать
Это небезразлично: оператор постинкремента сохраняет старое значение переменной, потому что он обязан вернуть это старое значение.
а ты уверен? я вот нет. зачем ему что-то сохранять, если он может вернуть, а потом увеличить, и тогда нет никакой разницы :) что сначала операция, потом возврат, что наоборот. Так что я придерживаюсь варианта как я себе это представляет, если у кого есть достоверная инфа по этому поводу, то просьба выложить сюда 8)

Оффлайн Shymep

  • Администратор
  • Действительный статский советник
  • *****
  • Сообщений: 1909
  • Репутация: 58
  • Пол: Мужской
Re: Трюки, приемы программирования
« Ответ #8 : јРав 30, 2007, 07:37:25 pm »
Где-то давно я уже участвовал в обсуждении этого вопроса  :)

http://www.progz.ru/forum/index.php?showtopic=22502&st=0
http://sql.ru/forum/actualthread.aspx?tid=308616&pg=2
Smile and the world will smile back :wink:

beholder

  • Гость
Re: Трюки, приемы программирования
« Ответ #9 : јРав 30, 2007, 07:53:01 pm »
melkiy прав, признаю ошибку :)

Оффлайн de666

  • Губернский секретарь
  • **
  • Сообщений: 41
  • Репутация: 0
  • Пол: Мужской
Re: Трюки, приемы программирования
« Ответ #10 : јРав 30, 2007, 09:35:29 pm »
какой код на ваш вгзляд эффективнее а какой красивее?
Код: (cpp) [Выделить]
class _func
{
private:
    static double _tol;
public:
    double operator()(double arg) {/*code_here*/}
    static void properties(double tolerance) { _tol = tolerance; }
} func;
Код: (cpp) [Выделить]
class func_properties
{
private:
    static double _tol;
public:
    static void properties(double tolerance) { _tol = tolerance; }
    friend double func(double);
};

double func(double arg) {/*code_here*/}

Оффлайн de666

  • Губернский секретарь
  • **
  • Сообщений: 41
  • Репутация: 0
  • Пол: Мужской
Re: Трюки, приемы программирования
« Ответ #11 : јРав 30, 2007, 10:24:07 pm »
если по ходу кода мне нужно использовать временную переменную но дальше она мне не нужна
Код: (cpp) [Выделить]
...
{
    const int a = 1/*expression_here*/;
    //code_here
}
...
как вы на это смотрите?

Оффлайн Shymep

  • Администратор
  • Действительный статский советник
  • *****
  • Сообщений: 1909
  • Репутация: 58
  • Пол: Мужской
Re: Трюки, приемы программирования
« Ответ #12 : јРав 30, 2007, 11:48:08 pm »
По поводу 1го вопроса: наверное дружественная функция и переопределяемый оператор служат обычно для разных целей, поэтому некорректно говорить о "красоте" :)

По поводу 2го вопроса: если речь идет о константе, то, как вариант, можно определить ее макросом
Код: (cpp) [Выделить]
#define A 1
Smile and the world will smile back :wink:

Оффлайн de666

  • Губернский секретарь
  • **
  • Сообщений: 41
  • Репутация: 0
  • Пол: Мужской
Re: Трюки, приемы программирования
« Ответ #13 : јРав 31, 2007, 10:18:01 am »
имелось ввиду что нужно написать функцию которую я буду часто использовать вдальнейшем и которая должна быть легко настраиваема
в обоих случаях можно будет вызывать функцию как func(че то там) но при использовании объекта класса настройка помоему более удобна и наглядна: func.property(аргумент)
во втором же случае ее можно будет настроить примерно так: func_properties.property(аргумент)

по воводу второго
если скажем в каком то куске кода мне нужно использовать много раз какое то выражение то логичнее было бы его посчитать один раз а потом подставлять посчитанное (особенно если выражение сколь нибудь сложное)
но дальше это значение мне не нужно поэтому по моей логике я заключаю эту часть кода в блок чтобы ненужная далее переменная не засоряла стэк (уничтожалась при выходе из области видимости)
как вам такое решение?

Оффлайн Leopotam

  • Темный свихнувшийся даритель банов, а так же
  • Администратор
  • Тайный советник
  • *****
  • Сообщений: 2119
  • Репутация: 16
  • Пол: Мужской
Re: Трюки, приемы программирования
« Ответ #14 : јРав 31, 2007, 12:00:55 pm »
Цитировать
ненужная далее переменная не засоряла стэк (уничтожалась при выходе из области видимости)
А с чего ты взял, что она будет хранится в стеке? Вообще-то все константы непосредственно инициализируются в коде, пример, так:
Код: (asm) [Выделить]
mov ax, 0x0001
Т.е. у тебя будет простое разбухание кода. Если ты сделаешь константу, то она сделает то же самое, но более оптимизировано и в момент компиляции.
Всех убью, один останусь...