Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Первые опыты в C++, анализ кода  
:(
    Опции темы
tatan
Дата 6.11.2007, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 31.10.2007

Репутация: нет
Всего: 1



Добрый день.

Я новичок в C++, работал с Delphi, на C не писал.

Читаю Либерти - Освой самостоятельно С++ за 21 день.
Решил попробовать для тренировки написать простой класс для работы с dbf.
Буду очень благодарен за замечания к моему коду: ошибки, неверные подходы,
скрытые угрозы, реализация чере ж..., таких косяков думаю здесь много.

Вообще, C++ понравился очень, возможности впечатляют, но иногда некоторые простые вещи
не понятно как делать, например работа с char.

Делалось все в Dev-C++ 4.9.9.2. Исходники присоединены. 
Заранее спасибо за любые комментарии.


Присоединённый файл ( Кол-во скачиваний: 20 )
Присоединённый файл  dbf.rar 4,33 Kb
PM MAIL   Вверх
Alek86
Дата 6.11.2007, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



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

мне, к примеру, лень качать, запускать Dev-C++ 4.9.9.2....


--------------------
user posted image    user posted image
PM MAIL   Вверх
tatan
Дата 6.11.2007, 16:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 31.10.2007

Репутация: нет
Всего: 1



Поскольку мало что понимаю что хорошо-плохо хочется комментарий по всему коду, там немного, строк 200
компилиться и в TC++
PM MAIL   Вверх
GrayCardinal
Дата 6.11.2007, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


Профиль
Группа: Завсегдатай
Сообщений: 3039
Регистрация: 9.11.2003

Репутация: 2
Всего: 58



Не разраривается  smile у меня линь  smile 

Это сообщение отредактировал(а) GrayCardinal - 6.11.2007, 16:44


--------------------
PM MAIL WWW   Вверх
tatan
Дата 6.11.2007, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 31.10.2007

Репутация: нет
Всего: 1



Вот блин
Положил zip

Присоединённый файл ( Кол-во скачиваний: 5 )
Присоединённый файл  dbf.zip 4,47 Kb
PM MAIL   Вверх
GrayCardinal
Дата 6.11.2007, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


Профиль
Группа: Завсегдатай
Сообщений: 3039
Регистрация: 9.11.2003

Репутация: 2
Всего: 58



tatan, 
Так, на вскидку :
1. if не надо закрывать точкой с запятой.
2. Определение класса должно быть в хэйдере.
Код

  unsigned long RecCount() const {return itsTableHeader.NumOfRecords;};
    unsigned long RecNo() const {return itsCurRec;};
    short RecSize() const {return itsTableHeader.RecordLen;};
    bool Eof() const {return itsEof;};
    bool Bof() const {return itsBof;};
    unsigned long FCount() const {return itsFieldsInfo.size();};


Лучше сделать "inline" (в каждую строчку, в начало). И тоже последние ";" не нужны.
3. for тоже не надо ";" в конце.
4. Рекомендую { ставить в той же строчке, что и оператор.
5. Все переменные  должны быть в начале функции.
Вроде всё smile



--------------------
PM MAIL WWW   Вверх
JackYF
Дата 6.11.2007, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(GrayCardinal @  6.11.2007,  16:44 Найти цитируемый пост)
у меня линь  smile

unrar есть smile

Цитата(GrayCardinal @  6.11.2007,  17:33 Найти цитируемый пост)
Все переменные  должны быть в начале функции.

С-стиль, весьма спорно.



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
GrayCardinal
Дата 6.11.2007, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


Профиль
Группа: Завсегдатай
Сообщений: 3039
Регистрация: 9.11.2003

Репутация: 2
Всего: 58



Код

 stringstream sss;
   sss<<"%"<<ll<<"."<<dd<<"f";
   char* d = (char*) malloc( strlen(sss.str().c_str()));
   strncpy(d, sss.str().c_str(), strlen(sss.str().c_str()));

Изварт чистейшей воды.
Проще так (на коленке):
Код

char ss[256];
sprintf (ss, "%%%d.%df", ll, dd);


Добавлено через 48 секунд
JackYF, 
Ничего спорного. Спросили как надо, я ответил  smile

Добавлено через 1 минуту и 15 секунд
JackYF, 
Унрар есть, я в курсе.


--------------------
PM MAIL WWW   Вверх
tatan
Дата 6.11.2007, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 31.10.2007

Репутация: нет
Всего: 1



to GrayCardinal
 Все принято, большое спасибо
Ну кроме про "{", но это кажется к области религиозных войн smile)

с sprintf - о как, не придумал бы сам-то, согласен у меня изврат, я долго думал как записать строку формата
PM MAIL   Вверх
GrayCardinal
Дата 6.11.2007, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


Профиль
Группа: Завсегдатай
Сообщений: 3039
Регистрация: 9.11.2003

Репутация: 2
Всего: 58



Далее. Указатели, перед тем как их удалять лучше проверять на NULL. И соответственно, после удаления присваивать NULL - для гарантии что не удалишь два раза один и тот же указатель.

Добавлено через 1 минуту и 3 секунды
tatan, 
Завсегда пожалуйста  smile 


--------------------
PM MAIL WWW   Вверх
tatan
Дата 6.11.2007, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 31.10.2007

Репутация: нет
Всего: 1



Указатели кстати проверял
Но в предыдущей теме ктото сказал что проверка указателей на валидность почти ошибка в проектировании, все и убрал оставив на потом
PM MAIL   Вверх
GrayCardinal
Дата 6.11.2007, 18:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


Профиль
Группа: Завсегдатай
Сообщений: 3039
Регистрация: 9.11.2003

Репутация: 2
Всего: 58



tatan, 
Не читал тот флуд, но на нуль всегда проверяю. Так жить проще  smile 


--------------------
PM MAIL WWW   Вверх
tatan
Дата 6.11.2007, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 31.10.2007

Репутация: нет
Всего: 1



Добавил в список рекомендаций - после удаления указателям присваивать NULL. "Так жить проще" (с) smile
PM MAIL   Вверх
archimed7592
Дата 6.11.2007, 18:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(GrayCardinal @  6.11.2007,  17:33 Найти цитируемый пост)
5. Все переменные  должны быть в начале функции.
Цитата(GrayCardinal @  6.11.2007,  17:39 Найти цитируемый пост)
Ничего спорного. Спросили как надо, я ответил  smile

А кто сказал, что так надо? smile


Цитата(GrayCardinal @  6.11.2007,  17:33 Найти цитируемый пост)
4. Рекомендую { ставить в той же строчке, что и оператор.

А я рекомендую так не делать smile.


Цитата(GrayCardinal @  6.11.2007,  17:39 Найти цитируемый пост)
Проще так (на коленке):

Ещё проще smile.
Код

sss<< setw(ll) << setprecision(dd) << num;


Добавлено через 48 секунд
Код

unsigned char dbfFldTypeChar = 'C';
unsigned char dbfFldTypeBool = 'L';
unsigned char dbfFldTypeNumeric = 'N';
...

Нужно:
Код

const unsigned char dbfFldTypeChar = 'C';
const unsigned char dbfFldTypeBool = 'L';
const unsigned char dbfFldTypeNumeric = 'N';



--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
GrayCardinal
Дата 6.11.2007, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


Профиль
Группа: Завсегдатай
Сообщений: 3039
Регистрация: 9.11.2003

Репутация: 2
Всего: 58



archimed7592, 
А передёргивать не надо  smile 


--------------------
PM MAIL WWW   Вверх
archimed7592
Дата 6.11.2007, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Код

class dbfTable
{
 public:
    dbfTable(char *tableName);
/* я бы добавил explicit к конструктору, иначе можно писать так:
    dbfTable tbl = "234.dbf"; или вообще dbfTable tbl = 0; (по смыслу бред получается)
    ещё: не char *, а const char *
*/
/*
    а где конструктор копирования, оператор присваивания?
*/
......
 private:
    dbfTableHeader itsTableHeader;
    char* itsTableName; // лучше использовать std::string - её не нужно удалять, не нужно выделять под неё память и т.д. - всё будет автоматом.
    fstream *itsTableFile; // зачем создавать поток динамически? 0_о
};

// ...
   itsTableFile = new fstream(itsTableName, ios::out | ios::binary);
   if (!itsTableFile) // не нужно ничего проверять - если new не удасться выделить память он бросит исключение.
   {
      cout << "Can\'t open file\n"; 
      return 1;
   };


Добавлено через 46 секунд
Цитата(GrayCardinal @  6.11.2007,  18:51 Найти цитируемый пост)
А передёргивать не надо  smile  

Ыыыы, где и чего я передёрнул? 0_о
С чем ты не согласен?

Добавлено через 1 минуту и 51 секунду
Цитата(tatan @  6.11.2007,  17:59 Найти цитируемый пост)
Но в предыдущей теме ктото сказал что проверка указателей на валидность почти ошибка в проектировании, все и убрал оставив на потом 

Проверка на 0 и проверка на валидность - разные вещи... smile

Добавлено через 7 минут и 7 секунд
Код

      if( s[i].FieldType != 'C' && 
          s[i].FieldType != 'N' &&
          s[i].FieldType != 'F' &&
          s[i].FieldType != 'D' &&
          s[i].FieldType != 'M' &&
          s[i].FieldType != 'L' )

Нафиг нужно было заводить константы в .hpp, когда здесь проверяешь по значению?

Добавлено через 8 минут и 59 секунд
Ааа, и ещё: С++ - не Дельфи... В С++ можно реализовывать разные ф-ции в разных файлах, т.е., можно было бы хотя бы все определения dbfTable::* вынести в отдельный файл, а ещё лучше разбить его потом на несколько файлов(разделив связанные по смыслу ф-ции).


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
maxim1000
Дата 6.11.2007, 19:05 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 17
Всего: 110



Цитата(GrayCardinal @  6.11.2007,  17:51 Найти цитируемый пост)
Указатели, перед тем как их удалять лучше проверять на NULL.

delete для нулевого указателя - вполне корректная операция


--------------------
qqq
PM WWW   Вверх
GrayCardinal
Дата 6.11.2007, 19:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


Профиль
Группа: Завсегдатай
Сообщений: 3039
Регистрация: 9.11.2003

Репутация: 2
Всего: 58



Цитата

для нулевого указателя - вполне корректная операция 

И правда... Только вот с каких пор ? Точно помню что сегфолты ловил на таком  smile 



--------------------
PM MAIL WWW   Вверх
archimed7592
Дата 6.11.2007, 19:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(GrayCardinal @  6.11.2007,  19:16 Найти цитируемый пост)
Только вот с каких пор ?

С оч древних - ещё в first edition(2003) было. Не знаю, как в ANSI-96(или какого он там года?).


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
GrayCardinal
Дата 6.11.2007, 19:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


Профиль
Группа: Завсегдатай
Сообщений: 3039
Регистрация: 9.11.2003

Репутация: 2
Всего: 58



archimed7592, 
maxim1000, 
А я долго не парился на эту тему smile
Код

#ifdef __cplusplus
#define DROP(arga) if (arga) { ::free (arga); arga = NULL; }
#else
#define DROP(arga) if (arga) { free (arga); arga = NULL; }
#endif


Добавлено через 1 минуту и 28 секунд
Код

С оч древних - ещё в first edition(2003) было

Так недавно ?  smile 


--------------------
PM MAIL WWW   Вверх
Alek86
Дата 6.11.2007, 19:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



Цитата(maxim1000 @  6.11.2007,  19:05 Найти цитируемый пост)
delete для нулевого указателя - вполне корректная операция


только, в частности, мелкософтский компилер тратит на "удаление" нулевого указателя гдето 11 тактов процессора вместо одной проверки, если напишешь сам


Цитата(GrayCardinal @  6.11.2007,  17:33 Найти цитируемый пост)
5. Все переменные  должны быть в начале функции.


GrayCardinal, ты когда-нить работал с большими переменными? зачем их объявлять в начале, если они по ходу дела могут не понадобиться? только время (процессорное) потратишь... или если переменная в конструкторе делает что-то немелкое по времени (к примеру, ищет сервер)


--------------------
user posted image    user posted image
PM MAIL   Вверх
tatan
Дата 6.11.2007, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 31.10.2007

Репутация: нет
Всего: 1



про "Еще проще" - записал
про const - запомнил
Спасибо
PM MAIL   Вверх
GrayCardinal
Дата 6.11.2007, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


Профиль
Группа: Завсегдатай
Сообщений: 3039
Регистрация: 9.11.2003

Репутация: 2
Всего: 58



Alek86, 
Если по ходу дела могут не понадобиться - лучше делать их динамическими. А если так, в центре функции, то читабельность стремится к нулю... Суть "объявления" переменных в начале - это просто меняется цифра в одной команде. А если в конструкторе что-то делается "долго", то опять таки лучше    
динамически ...  smile

Добавлено через 2 минуты и 50 секунд
Alek86, 
О чём спорим ?  smile 

Это сообщение отредактировал(а) GrayCardinal - 6.11.2007, 19:35


--------------------
PM MAIL WWW   Вверх
Alek86
Дата 6.11.2007, 19:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



ну, еще стек зря заполняется, если я правильно понимаю...
хотя, предупрежу, что тут я не эксперт
и доводы привел не свои, а из "ленивого программирования"
smile


Цитата(GrayCardinal @  6.11.2007,  19:33 Найти цитируемый пост)
А если так, в центре функции, то читабельность стремится к нулю...

чувствуется закоренелый сишник. с такими сиплюсплюсникам лучше не спорить - ато опять религ. война посреди темы разгорится smile

Добавлено через 3 минуты и 40 секунд
Цитата(archimed7592 @  6.11.2007,  18:54 Найти цитируемый пост)
 В С++ можно реализовывать разные ф-ции в разных файлах,


опять левый вопрос

насколько позволительно с точки зрения "общепринятого стиля" инклудить cpp в другие cpp?
или 1 cpp <-> 1 h ?


--------------------
user posted image    user posted image
PM MAIL   Вверх
archimed7592
Дата 6.11.2007, 19:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(GrayCardinal @  6.11.2007,  19:33 Найти цитируемый пост)
Если по ходу дела могут не понадобиться - лучше делать их динамическими.

Вот даже как... 0_о


Цитата(GrayCardinal @  6.11.2007,  19:33 Найти цитируемый пост)
. А если так, в центре функции, то читабельность стремится к нулю...

Переменная должна быть как можно ближе к месту первого использования, а ещё лучше, если это возможно обернуть место её использования в отдельный scope.
И ещё, как это читабельность может стремиться к нулю, если средний размер ф-ции 10-25 строк?
Цитата(GrayCardinal @  6.11.2007,  19:33 Найти цитируемый пост)
то опять таки лучше    
динамически ...  smile

И стражей(boost::mutex, к примеру)? Тоже динамически? А если исключение? Я вообще не помню, когда в последний раз писал delete(это я о том, что если я что-то динамически и выделяю, то есть нечто статическое(вроде shared_ptr), которое обязательно удалит это).


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
tatan
Дата 6.11.2007, 19:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 31.10.2007

Репутация: нет
Всего: 1



to archimed759:
"я бы добавил explicit к конструктору" - про explicit пока ничего не знаю.Буду читать.

про копировщик и присваивание - записал, не знаю правда как это все сделать

"char* itsTableName; // лучше использовать std::string" - здесь затупил, спасибо

"fstream *itsTableFile; // зачем создавать поток динамически? 0_о" - извращение, уже понял

"if (!itsTableFile) // не нужно ничего проверять - если new не удасться выделить память он бросит исключение" - так было в книжке, 
пока не читал про exception s, наверняка можно писать свои обработчики исключений, но это впереди

"Нафиг нужно было заводить константы в .hpp, когда здесь проверяешь по значению?" - един-е объяснение - затупил

to GrayCardinal:

"А я долго не парился на эту тему smile" - пока эта конструкция с define не очень понятня, думаю разбирусь
Спасибо
PM MAIL   Вверх
archimed7592
Дата 6.11.2007, 20:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(tatan @  6.11.2007,  19:51 Найти цитируемый пост)
пока не читал про exception s, наверняка можно писать свои обработчики исключений, но это впереди

Суть сказанного была не про исключения а про то, что new(в той форме в которой ты его написал) никогда не вернёт 0.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
tatan
Дата 6.11.2007, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 31.10.2007

Репутация: нет
Всего: 1



понял, и скорее всего в книжке было както так

Код

  fstream itsTableFile(itsTableName, ios::out | ios::binary);
   if (!itsTableFile)
       ....



PM MAIL   Вверх
maxim1000
Дата 6.11.2007, 22:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 17
Всего: 110



Цитата(GrayCardinal @  6.11.2007,  19:23 Найти цитируемый пост)
#define DROP(arga) if (arga) { ::free (arga); arga = NULL; }

та я про free как-то и не говорил
а в своём посте специально написал delete


--------------------
qqq
PM WWW   Вверх
archimed7592
Дата 6.11.2007, 22:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(maxim1000 @  6.11.2007,  22:29 Найти цитируемый пост)
та я про free как-то и не говорил

И, тем не менее, free так же ничего не сделает в случае с нулевым указателем.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
GrayCardinal
Дата 7.11.2007, 09:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


Профиль
Группа: Завсегдатай
Сообщений: 3039
Регистрация: 9.11.2003

Репутация: 2
Всего: 58



Цитата

Переменная должна быть как можно ближе к месту первого использования, а ещё лучше, если это возможно обернуть место её использования в отдельный scope.

Это откуда ?


--------------------
PM MAIL WWW   Вверх
zkv
Дата 7.11.2007, 10:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



Цитата(GrayCardinal @  7.11.2007,  09:27 Найти цитируемый пост)
Это откуда ? 

вроде Страуструп так говорил. 
Да и вообще прописная истина...
PM MAIL   Вверх
GrayCardinal
Дата 7.11.2007, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


Профиль
Группа: Завсегдатай
Сообщений: 3039
Регистрация: 9.11.2003

Репутация: 2
Всего: 58



zkv, 
Вот
 это для меня прописные истины  smile

Добавлено через 1 минуту и 11 секунд
Цитата

что (a) K&R _правы_, а так же что (б) K&R правы.



--------------------
PM MAIL WWW   Вверх
zkv
Дата 7.11.2007, 10:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



Цитата(GrayCardinal @  7.11.2007,  10:47 Найти цитируемый пост)
Вот
 это для меня прописные истины

учитывая что в ссылке обсуждается Си, а мы говорим о С++, аргумент не очень убедителен. 
 smile 
PM MAIL   Вверх
GrayCardinal
Дата 7.11.2007, 10:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


Профиль
Группа: Завсегдатай
Сообщений: 3039
Регистрация: 9.11.2003

Репутация: 2
Всего: 58



zkv, 
Уел таки smile


--------------------
PM MAIL WWW   Вверх
archimed7592
Дата 7.11.2007, 11:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(GrayCardinal @  7.11.2007,  09:27 Найти цитируемый пост)
Это откуда ? 

Мейрс.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
GrayCardinal
Дата 7.11.2007, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


Профиль
Группа: Завсегдатай
Сообщений: 3039
Регистрация: 9.11.2003

Репутация: 2
Всего: 58



archimed7592, 
Может линк есть ? А то как-то неубедительно  smile 


--------------------
PM MAIL WWW   Вверх
archimed7592
Дата 7.11.2007, 11:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



35 правил, оч известная книга.

Добавлено через 38 секунд
Номер главы не скажу, ибо сейчас у меня её под рукой нет.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
MAKCim
Дата 7.11.2007, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



archimed7592, 
zkv, 
можно подробнее об этом
я ничего такого не читал
единственное для меня объяснение - это кэширование, т. е чем дальше определение переменной от точки использования, тем больше вероятность того, что данные, которые соответствуют переменной, не будут находится в кэше CPU

Это сообщение отредактировал(а) MAKCim - 7.11.2007, 11:44


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
archimed7592
Дата 7.11.2007, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



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


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
zkv
Дата 7.11.2007, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



MAKCim, ты рассматриваешь все только с точки зрения оптимизации
принцип совета тот же, что и в совете избегать глобальных переменных по возможности.
ведь можно отказаться от локальных переменных вообще, использовать только глобальные (забудем на время где там что храниться будет, смотрим только с точки зрения прозрачности кода) - нелегко будет разбирать такую программу.
Это утрированный пример, но тенденция понятна, наверное?
PM MAIL   Вверх
SaDFromSpb
Дата 7.11.2007, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 263
Регистрация: 5.4.2006
Где: Санкт-Петербург

Репутация: 3
Всего: 3



Цитата(GrayCardinal @  7.11.2007,  10:47 Найти цитируемый пост)
 это для меня прописные истины 

Вот скажи, а ядро Линуха до сих пор на си пишется? Там, типа, ООП не нужно?
Совершенно без иронии, просто интересно. А ссылка с этими истинами, у меня не открывается что-то...



--------------------
"За исключением части, касающейся потоков, библиотека Loki написана на стандартном языке С++. Увы, это означает, что многие современные компиляторы не смогут работать с ней в полном объеме." (А. Александреску. Modern C++ design. 2001)
PM   Вверх
MAKCim
Дата 7.11.2007, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(archimed7592 @  7.11.2007,  11:47 Найти цитируемый пост)
но, ему будет проще оптимизировать, когда он будет знать, что данная переменная фигурирует здесь(в данном scope) и не фигурирует нигде больше. 

как это соотносится с этим
Цитата(archimed7592 @  7.11.2007,  11:47 Найти цитируемый пост)
компилятор всё равно выделит место в стеке под все нужные переменные в начале ф-ции

?
EBP не меняется в пределах функции, так что, имхо, все равно, откуда обращаться к локальной переменной
Цитата(zkv @  7.11.2007,  11:56 Найти цитируемый пост)
Это утрированный пример, но тенденция понятна, наверное?

аналогия с глобальными переменными не уместна, имхо
тогда уж и "разбрасывание" переменных по всему телу функции надо исключать
Цитата(archimed7592 @  7.11.2007,  11:47 Найти цитируемый пост)
Кэш тут не при чём.

немного все же причем  smile

Добавлено через 3 минуты и 44 секунды
Цитата(SaDFromSpb @  7.11.2007,  12:21 Найти цитируемый пост)
Вот скажи, а ядро Линуха до сих пор на си пишется? Там, типа, ООП не нужно?

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


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
archimed7592
Дата 7.11.2007, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(MAKCim @  7.11.2007,  12:36 Найти цитируемый пост)
как это соотносится с этим

К примеру, если scope ограничен, он может вообще воспользоваться регистрами.

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


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
MAKCim
Дата 7.11.2007, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(archimed7592 @  7.11.2007,  12:40 Найти цитируемый пост)
Потом возьми умные объекты. mutex к примеру. Если ты сделаешь его в начале ф-ции, то всё время работы ф-ции мьютекс будет залочен, если же заключить его в тот scope в котором он реально нужен, то повысится эффективность. 

мы говорим о расположении локальных переменных
а лочить можно где угодно


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
UnrealMan
Дата 7.11.2007, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Цитата(archimed7592 @  7.11.2007,  11:34 Найти цитируемый пост)
35 правил, оч известная книга.

55 smile
Если точнее: Эффективное использование C++. 55 верных советов улучшить структуру и код ваших программ
Правило 26: Откладывайте определение переменных насколько возможно.

Есть ещё в "Стандарты программирования на C++. 101 правило и рекомендация" (Герб Саттер, Андрей Александреску)
18. Объявляйте переменные как можно локальнее.
PM MAIL   Вверх
MAKCim
Дата 7.11.2007, 12:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(archimed7592 @  7.11.2007,  12:40 Найти цитируемый пост)
К примеру, если scope ограничен, он может вообще воспользоваться регистрами.

первый раз все равно идет чтение в регистр
и неважно, где расположена при этом переменная


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
archimed7592
Дата 7.11.2007, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(UnrealMan @  7.11.2007,  12:45 Найти цитируемый пост)
55 smile

55 я начал читать, но когда понял, что это то же самое что и 35 читать стало лень(а в магазине сказали "они дополняют друг друга") smile.


MAKCim, в принципе ты можешь писать в стиле Си smile. У меня сейчас не соображает голова чтобы дать тебе весомые аргументы, что писать нужно иначе... Возьми что ли Мейрса с Александреску у кого-нибудь, пролистай указаные правила.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
MAKCim
Дата 7.11.2007, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



archimed7592, 
Цитата(archimed7592 @  7.11.2007,  13:09 Найти цитируемый пост)
MAKCim, в принципе ты можешь писать в стиле Си

спасибо  smile 
на самом деле я просто хочу разобраться
Цитата(archimed7592 @  7.11.2007,  13:09 Найти цитируемый пост)
Возьми что ли Мейрса с Александреску у кого-нибудь, пролистай указаные правила. 

эх, если бы кто-нибудь здесь цитату привел
а то искать лень  smile 


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
GrayCardinal
Дата 7.11.2007, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


Профиль
Группа: Завсегдатай
Сообщений: 3039
Регистрация: 9.11.2003

Репутация: 2
Всего: 58



SaDFromSpb, 
ООП ? Да там проблемы какие-то с распределением памяти были... Да и на самом деле - не нужно оно для ядра...


--------------------
PM MAIL WWW   Вверх
UnrealMan
Дата 7.11.2007, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Цитата(MAKCim @  7.11.2007,  11:36 Найти цитируемый пост)
archimed7592, 
zkv, 
можно подробнее об этом

Аргументов 2:
1) производительность - в случае неиспользования переменных не должны зря вызываться конструкторы и деструкторы,
2) читабельность/самодокументируемость кода выше, когда переменная объявлена ближе к месту использования и инициализируется в месте объявления (хорошо видно, когда и для чего нужна переменная).


Это сообщение отредактировал(а) UnrealMan - 7.11.2007, 14:24
PM MAIL   Вверх
tatan
Дата 7.11.2007, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 31.10.2007

Репутация: нет
Всего: 1



Внимательно все прочитал
Лично я наверное буду по-паскалевски объявлять переменные в начале а для лучшей читаемости кода давать переменным 
осмысленные имена, ну, видимо, это вера.у каждого подхода есть +-smile Оставляю решение на потом, видимо с приобретением новых знаний
я получу аргументы в пользу той или иной доктриныsmile

Жалко, что мы отвлеклись. и если позволите еще важный вопрос, скоре всего из разряда RTFM но не получается у меня.

Вынес описание класса в файл dbft.hpp, реализацию в файл dbft.cpp, создал проект с main() в файле dbfex.cpp.
В файле dbft.cpp сделал #include "dbft.hpp", в файле dbfex.cpp  - тоже.
При компиляции получаю ошибку "In file included from dbfex.cpp" на строке #include "dbft.hpp" в файле dbft.cpp
То есть видимо ругается что 2 раза включен
Как надо правильно сделать?  
PM MAIL   Вверх
zkv
Дата 7.11.2007, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



Цитата(tatan @  7.11.2007,  14:44 Найти цитируемый пост)
Лично я наверное буду по-паскалевски объявлять переменные в начале а для лучшей читаемости кода давать переменным 
осмысленные имена, ну, видимо, это вера.у каждого подхода есть +

что то пока я не заметил ни одного плюса у предварительного объявления переменных
Цитата(tatan @  7.11.2007,  14:44 Найти цитируемый пост)
То есть видимо ругается что 2 раза включен

защитить хедер от двойного подключения, 
добавь первой строкой 
Код

#pragma once 


либо обрами весь код в хедере таким макросом:
Код

#ifndef MYHEADER_H
#define MYHEADER_H

//весь код тут

#endif//MYHEDER_H


Это сообщение отредактировал(а) zkv - 7.11.2007, 16:08
PM MAIL   Вверх
tatan
Дата 7.11.2007, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 31.10.2007

Репутация: нет
Всего: 1



Пробовал оба варианта
Нет, наверное ругается по другому поводу
ошибки в dbft.hpp дальше описываются - типа fstream does not name a type, и тд
 я правильно сделал включив в файл dbft.hpp  строки ?

#include <cstdlib>
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <sstream> 

Без них собствено те же ошибки
Блин

Добавлено через 11 минут и 15 секунд
Ура, заработало!smile
инклюдить  надо после using namespace std а то компилер ничего не находитsmile
Всем спасибо
PM MAIL   Вверх
zkv
Дата 7.11.2007, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



Цитата(tatan @  7.11.2007,  15:41 Найти цитируемый пост)
using namespace std

лучше не использовать - плохой тон
Цитата(MAKCim @  7.11.2007,  13:15 Найти цитируемый пост)
эх, если бы кто-нибудь здесь цитату привел

из дежавю копировал, поэтому на форматирование не жаловаться smile
Цитата(Правило 26: Откладывайте определение переменных насколько возможно )

Всякий раз при объявлении переменной, принадлежащий типу, в котором есть 
конструктор или деструктор, программа тратит время на ее конструирование, 
когда поток управления достигнет определения переменной, и на уничтожение - 
при выходе переменной из области видимости. Эти накладные расходы  
приходится нести даже тогда, когда переменная не используется, и, разумеется, их  
хотелось бы избежать. 
Вероятно, вы думаете, что никогда не объявляете неиспользуемых  
переменных, но так ли это? Рассмотрим следующую функцию, которая возвращает  
зашифрованный пароль при условии, что его длина не меньше некоторого  
минимума. Если пароль слишком короткий, функция возбуждает исключение типа 
logicerror, определенное в стандартной библиотеке C++ (см. правило 54): 
// эта функция объявляет переменную encrypted слишком рано 
std::string encryptPassword(conSt std::strings password) 
{ 
using namespace std; 
string encrypted; 
if(password.length() < MinimumPasswordLength) { 
throw logic_error("Слишком короткий пароль"); 
Реализация 
// сделать все, что необходимо для помещения 
// зашифрованного пароля в переменную encrypted 
return encrypted; 
Нельзя сказать, что объект encrypted в этой функции совсем уж не  
используется, но он не используется в случае, когда возбуждается исключение. Другими 
словами, вы платите за вызов конструктора и деструктора объекта encrypted, 
даже если функция encryptPassword возбуждает исключение. Так не лучше ли 
отложить определение переменной encrypted до того момента, когда вы будете 
знать, что она нужна? 
// в этой функции определение переменной encrypted отложено до момента, 
// когда в ней возникает надобность 
std::string encryptPassword(const std::strings password) 
{ 
using namespace std; 
if(password.length() < MinimumPasswordLength) { 
throw logic_error("Слишком короткий пароль"); 
string encrypted; 
// сделать все, что необходимо для помещения 
// зашифрованного пароля в переменную encrypted 
return encrypted; 
} 
Этот код все еще не настолько компактный, как мог бы быть, потому что  
переменная encrypted определена без начального значения. А значит, будет  
использован ее конструктор по умолчанию. Часто первое, что нужно сделать с объектом, - 
это дать ему какое-то значение, нередко посредством присваивания. В правиле 4 
объяснено, почему конструирование объектов по умолчанию с последующим 
присваиванием значения менее эффективно, чем инициализация нужным  
значением с самого начала. Это относится и к данному случаю. Например,  
предположим, что для выполнения «трудной» части работы функция encryptPassword  
вызывает следующую функцию: 
void encrypt(std::strings s); // шифрует s по месту 
Тогда encryptPassword может быть реализована следующим образом, хотя и 
это еще не оптимальный способ: 
// в этой функции определение переменной encrypted отложено до момента, 
// когда в ней возникает надобность, но и этот вариант еще недостаточно 
// эффективен 
std::string encryptPassword(const std::stringS password) 
... // проверка длины 
string encrypted; // конструктор по умолчанию 
encrypted = password; // присваивание encrypted 
encrypt(encrypted) ; 
return encrypted; 

Еще лучше инициализировать encrypted параметром password, избежав  
таким образом потенциально дорогостоящего конструктора по умолчанию: 
// а это оптимальный способ определения и инициализации encrypted 
std::string encryptPassword(const std::string& password) 
{ 
... // проверка длины 
string encrypted(password); // определение и инициализация 
// конструктором копирования 
encrypt(encrypted); 
return encrypted; 
} 
Это и означает «откладывать насколько возможно» (как сказано в заголовке 
правила). Вы не только должны откладывать определение переменной до того 
момента, когда она используется, нужно еще постараться отложить определение 
до получения аргументов для инициализации. Поступив так, вы избегаете  
конструирования и разрушения ненужных объектов, а также излишних вызовов  
конструкторов по умолчанию. Более того, это помогает документировать назначение 
переменных за счет инициализации их в том контексте, в котором их значение 
понятно без слов. 
«А как насчет циклов?» - можете удивиться вы. Если переменная  
используется только внутри цикла, то что лучше: определить ее вне цикла и выполнять 
присваивание на каждой итерации или определить ее внутри цикла? Другими 
словами, какая из следующих конструкций предпочтительнее? 
// Подход А: определение вне цикла 
Widget w; 
for(int 1=0; Kn; ++i) { 
w = некоторое значение, зависящее от i; 
II Подход В: определение внутри цикла 
fordnt i=0; i<n; ++i) { 
Widget «(некоторое значение, зависящее от i); 
Здесь я перехожу от объекта типа string к объекту типа Widget, чтобы избежать 
любых предположений относительно стоимости конструирования, разрушения 
и присваивания. 
В терминах операций Widget накладные расходы вычисляются так: 
Q Подход А: 1 конструктор + 1 деструктор + п присваиваний 
? Подход В: п конструкторов + п деструкторов 
Для классов, в которых стоимость операции присваивания меньше, чем пары 
конструктор-деструктор, подход А обычно более эффективен. Особенно это  
верно, когда значение п достаточно велико. В противном случае, возможно, подход В 
лучше. Более того, в случае А имя w видимо в более широкой области  
(включающей в себя цикл), чем в случае В, а иногда это делает программу менее понятной 
и удобной для сопровождения. Поэтому если A) нет априорной информации 
Реализация 
о том, что присваивание обходится дешевле, чем пара конструктор-деструктор, и 
B) речь идет о части программы, производительность которой критична, то по 
умолчанию рекомендуется использовать подход В. 
Что следует помнить 
Ш Откладывайте определение переменных насколько возможно. Это  
делает программы яснее и повышает их эффективность. 

PM MAIL   Вверх
SergeCpp
Дата 7.11.2007, 17:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


 
**


Профиль
Группа: Участник
Сообщений: 955
Регистрация: 8.8.2005
Где: At Home

Репутация: 15
Всего: 124



Цитата(MAKCim @  7.11.2007,  14:36 Найти цитируемый пост)
EBP не меняется в пределах функции, так что, имхо, все равно, откуда обращаться к локальной переменной

Использовать EBP в качестве того, для чего он предназначен изначально — расточительство.
Visual Studio 6, к примеру (Release), использует EBP как регистр общего назначения.
Переменные адресуются по ESP (да, это сложнее, на то он и компилятор, чтобы справиться, он и справляется).
Подозреваю, что и другие компиляторы не разбрасываются регистрами.

PM MAIL WWW ICQ   Вверх
MAKCim
Дата 7.11.2007, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(SergeCpp @  7.11.2007,  17:00 Найти цитируемый пост)
Переменные адресуются по ESP (да, это сложнее, на то он и компилятор, чтобы справиться, он и справляется).
Подозреваю, что и другие компиляторы не разбрасываются регистрами

использование ESP, +1 байт к каждой инструкции
расточительно, однако  smile (учитывая, что локальных переменных обычно много)
тут надо соблюдать равновесие между оптимизацией по скорости и размеру

Добавлено через 3 минуты и 29 секунд
zkv, 
спасибо за ссылку



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1141 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.