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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Stl: в чем плюсы шаблонов? 
:(
    Опции темы
Alca
Дата 26.5.2009, 18:01 (ссылка)   | (голосов:14) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Stl: в чем плюсы шаблонов?


--------------------
PM WWW ICQ Skype Jabber   Вверх
andrew_121
Дата 26.5.2009, 19:49 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


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

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



Во всем. На буст посмотри.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
Alca
Дата 26.5.2009, 20:58 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата

Во всем.

 smile 


--------------------
PM WWW ICQ Skype Jabber   Вверх
azesmcar
Дата 26.5.2009, 21:12 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



Цитата(Alca @  26.5.2009,  18:01 Найти цитируемый пост)
в чем плюсы шаблонов? 

они классные smile 

Что значит в чем плюсы? Шаблоны - это полиморфизм времени компиляции. Плюс в том что грамотно используя шаблоны можно избежать написания лишнего кода (т.е. возложить эту обязанность на плечи компилятора)

Это сообщение отредактировал(а) azesmcar - 26.5.2009, 21:14
PM   Вверх
nerezus
Дата 26.5.2009, 22:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вселенский отказник
****


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

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



Минусы это - они лишат тебя удовольствия написания сотен строк кода, заменив это всего лишь парой строк.


--------------------
Сообщество художников Artsociety.ru
PM MAIL WWW   Вверх
GoldFinch
Дата 26.5.2009, 23:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



тут недавно советовали вместо 1 шаблона перегрузку юзать, для всех возможных типов...
PM MAIL ICQ   Вверх
Dmi3ev
Дата 26.5.2009, 23:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Тупой вопрос...   smile 
А в чем минусы? 


--------------------

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


трололомен
****


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

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



smile 

плюсы в кошерности.

зы. ыыы.
PM MAIL   Вверх
math64
Дата 27.5.2009, 08:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Минусы в том, что хотя ты пишешь код один раз, при каждом использовании шаблона с новым типом, его код дублируется и размер исполняемого файла растёт.
PM   Вверх
Lazin
Дата 27.5.2009, 08:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



Цитата(math64 @  27.5.2009,  08:04 Найти цитируемый пост)
Минусы в том, что хотя ты пишешь код один раз, при каждом использовании шаблона с новым типом, его код дублируется и размер исполняемого файла растёт. 

а когда пишешь разный код для разных типов не растет?
PM MAIL Skype GTalk   Вверх
MAKCim
Дата 27.5.2009, 08:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Lazin @  27.5.2009,  08:44 Найти цитируемый пост)
а когда пишешь разный код для разных типов не растет? 

а зачем писАть разный код для разных типов?  smile 


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

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


Эксперт
****


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

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



Цитата

Тупой вопрос... 

 smile

Добавлено через 2 минуты и 3 секунды
Минус в том, что если нет инстанцирования шаблона, то компилер не будет проверять его синтаксис.


--------------------
PM WWW ICQ Skype Jabber   Вверх
Lazin
Дата 27.5.2009, 09:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



Цитата(MAKCim @  27.5.2009,  08:58 Найти цитируемый пост)
а зачем писАть разный код для разных типов?

вот за этим
Код

class uber_object
{
    char big_field[0x1000];
    ...
};

class small_object
{
    char small_field[8];
    ...
};

std::list<uber_object*> lst1;
std::list<small_object> lst2;

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

Добавлено через 3 минуты и 47 секунд
Цитата(Alca @  27.5.2009,  09:19 Найти цитируемый пост)
Минус в том, что если нет инстанцирования шаблона, то компилер не будет проверять его синтаксис

вот именно синтаксис он и будет проверять для всех шаблонов(правда visual studio это не делает)

Это сообщение отредактировал(а) Lazin - 27.5.2009, 09:23
PM MAIL Skype GTalk   Вверх
math64
Дата 27.5.2009, 09:26 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Lazin @  27.5.2009,  08:44 Найти цитируемый пост)
а когда пишешь разный код для разных типов не растет?

Растёт - но ты сам видишь что растёт, и чтобы он не рос принимешь меры, например для двух разных типов создаёшь обший базовый класс и переносишь общий код в него. А при применении шаблонов можешь об этом и не задумываться.
Например, нужен тебе список для хранения типов A, B, C, D, E, F ...
Ты пишешь:
Код

list<A> list_a;
list<B> list_b;
list<C> list_c;
list<D> list_d;
list<E> list_e;
list<F> list_f;

Код шаблона list размножился 6 раз
А в этом слечае:
Код

class voidlist : public list<void*> {
voidlist();
voidlist(const voidlist&);
virtual ~voidlist();
voidlist& operator = (const voidlist&);
};

template <class T> ptrlist : public voidlist {
public:
 T* front() { return (T*)voidlist::front(); }
 void push_front(T* t) ( voidlist::push_front((void*)t); }
 ...
};
ptrlist<A> list_a;
ptrlist<B> list_b;
ptrlist<C> list_c;
ptrlist<D> list_d;
ptrlist<E> list_e;
ptrlist<F> list_f;

хоть и применены шаблоны, но основной код шаблона не размножается.

Это сообщение отредактировал(а) math64 - 27.5.2009, 09:29
PM   Вверх
Alca
Дата 27.5.2009, 09:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата

правда visual studio это не делает

не делает  smile

Добавлено через 3 минуты и 45 секунд
А если функция может использовать только один тип данных, стоит ли использовать шаблон?


--------------------
PM WWW ICQ Skype Jabber   Вверх
Lazin
Дата 27.5.2009, 09:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



Цитата(math64 @  27.5.2009,  09:26 Найти цитируемый пост)
хоть и применены шаблоны, но основной код шаблона не размножается

с чего ты это взял? будут точно так-же созданы N реализаций шаблона smile 
PM MAIL Skype GTalk   Вверх
math64
Дата 27.5.2009, 09:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Alca @  27.5.2009,  09:33 Найти цитируемый пост)
А если функция может использовать только один тип данных, стоит ли использовать шаблон?

Иногда стоит - если ты эту функцию объявил, но не используешь в данном проекте, то она не будет включена в исполняемый файл.
А если функция обычная, то она будет всегда включена в исполняемый файл, даже если не нужна (если файл с функцией исключить нельзя, поскольку в нём есть нужные функции и он используется в другом проекте, где все функции нужны)
PM   Вверх
Lazin
Дата 27.5.2009, 09:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



Цитата(Alca @  27.5.2009,  09:33 Найти цитируемый пост)
А если функция может использовать только один тип данных, стоит ли использовать шаблон? 

нет, какой смысл в шаблоне, если все-равно будет только один вариант функции?
PM MAIL Skype GTalk   Вверх
math64
Дата 27.5.2009, 09:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Lazin @  27.5.2009,  09:43 Найти цитируемый пост)
с чего ты это взял? будут точно так-же созданы N реализаций шаблона

Я сказал: основной код шаблона не размножается. Большинство методов будет взято из базового класса или будут inline-методами,
вызывающими метод базового класса с кастингом аргументов и результата. Фактически размножатся только конструктор и деструктор.
PM   Вверх
Alca
Дата 27.5.2009, 09:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата

нет, какой смысл в шаблоне, если все-равно будет только один вариант функции?

Она же не будет включена в исполняемый файл.


--------------------
PM WWW ICQ Skype Jabber   Вверх
zim22
Дата 27.5.2009, 10:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

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



Цитата(math64 @  27.5.2009,  09:48 Найти цитируемый пост)
Фактически размножатся только конструктор и деструктор.

Из книжечки "Программирование на С++". Коплиен

Цитата

используя идиому косвенного шаблона можно в полной мере использовать возможности параметризации без затрат на дублирование кода в разных версиях шаблонного класса.
...
Далее приведено простое приложение, использующее параметризованный тип Set, который в свою очередь использует параметризованный тип List. Хотя в программе встречаются две разновидности Set, для поддержки обеих создается только одна специализация List

main.cpp
Код

Set<int> foo;
Set<double> bar;

foo.add(1);
foo.add(2);
cout << foo.get() << endl;
cout << foo.get() << endl;

bar.add(3.0);
bar.add(4.2);
cout << bar.get() << endl;
cout << bar.get() << endl;

List.h
Код

#ifndef LIST_H
#define LIST_H

template <class T> class List;

template <class T> class ListItem {
  friend class List<T>;
private:
  ListItem<T> *next;
  const T item;
  ListItem(ListItem<T> *n, const T &i) : item(i), next((ListItem<T>*)n) { }
};

template <class T>
class List {
public:
  void sort(); // сортировка списка "на месте"
  void put(const T &t) { head = new ListItem<T>(head, t); }
  T get() { // выборка из начала списка
    T retval = head->item;
    ListItem<T> *temp = head;
    head = head->next;
    delete temp;
    return retval;
  }
  int element(const T &t) const { return 0; } // проверка принадлежности
  // ...                         // другие операции
  int size() const;              // количество элементов
  List() : head(0) { }
private:
  ListItem<T> *head;
};
#endif // LIST_H

Set.h
Код

#ifndef SET_H
#define SET_H

#include "List.h"

class SetBase {
  friend class ErsatzListElement;
private:
  virtual int comparelt(const void*, const void*) const = 0;
  virtual int compareeq(const void*, const void*) const = 0;
};

class ErsatzListElement {
  // Класс не параметризуется: это означает,
  // что одна специализация шаблона List обслуживает
  // все специализации Set
public:
  const void *rep;
  int operator<(const ErsatzListElement &l) const {
    return theSet->comparelt(this, &l);
  }
  int operator==(const ErsatzListElement &l) const {
    return theSet->compareeq(this, &l);
  }
  ErsatzListElement(const void *v = 0) : rep(v) { }
  ErsatzListElement(const SetBase *s, void *v = 0) : theSet(s), rep(v) { }
private:
  const SetBase *theSet;
};

template <class T> 
class Set : private SetBase {
public:
  void add(T t2) {
    if (!exists(t2)) {
      ErsatzListElement t(this, new T(t2)); 
      rep.put(t);
    }
  }
  T get() {
    ErsatzListElement l = rep.get();
    return *((T*)(l.rep));
  }
  void remove(const T&);
  int exists(const T &e) {
    ErsatzListElement t(this, (T*)&e);
    return rep.element(t);
  }
  Set<T> Union(const Set<T>&) const;
  Set<T> Intersection(const Set<T>&) const;
  int size() const { return rep.size(); }
  void sort() { rep.sort(); }
  Set();
private:
  List<ErsatzListElement> rep;
  int comparelt(const void *v1, const void *v2) const {
    const T *t1 = (const T*)v1;
    const T *t2 = (const T*)v2;
    return *t1 < *t2;
  }
  int compareeq(const void *v1, const void *v2) const {
    const T *t1 = (const T*)v1;
    const T *t2 = (const T*)v2;
    return *t1 == *t2;
  }
};
template <class T>
Set<T>::Set() { }

#endif // SET_H


Это сообщение отредактировал(а) zim22 - 27.5.2009, 10:20


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


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



  Есть и минусы, шаблон это общее решение. Общее решение всегда не быстрее грамотного частного решения. Шаблон должен использовать только общие возможности всех типов для которых он предназначен, тогда как специальный класс может использовать все возможности того типа с которым он работает.
  Для сравнения создайте вектор, например из 1024 байтов и добавьте еще элемент так чтобы было перераспределение и сделайте аналогичные операции руками при помощи new для выделения памяти/memcpy для копирования элементов/memset для инициализации нулями. Думаю скорость будет выше раза в два.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
ilyuha
Дата 27.5.2009, 10:12 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Alca @  27.5.2009,  09:48 Найти цитируемый пост)
Она же не будет включена в исполняемый файл. 

 smile Кто она? Код ф-ии? smile А куда он денется?

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


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



Цитата(Alexeis @  27.5.2009,  10:10 Найти цитируемый пост)
Для сравнения создайте вектор, например из 1024 байтов и добавьте еще элемент так чтобы было перераспределение и сделайте аналогичные операции руками при помощи new для выделения памяти/memcpy для копирования элементов/memset для инициализации нулями. Думаю скорость будет выше раза в два. 

бессовестная ложь smile 
PM MAIL Skype GTalk   Вверх
Cтpaнник
Дата 27.5.2009, 10:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Alexeis @ 27.5.2009,  10:10)
Есть и минусы, шаблон это общее решение. Общее решение всегда не быстрее грамотного частного решения. [...]
  Для сравнения создайте вектор, например из 1024 байтов и добавьте еще элемент [...] Думаю скорость будет выше раза в два.

Это верно. Однако, не следует преждевременно оптимизировать - во всяком случае, раньше, чем профилировщик и/или пользователи не обратили ваше внимание на низкую производительность.

Готовый шаблон из STL нужно - только использовать. Собственный вектор - нужно сначала написать, потом отладить, убедиться в отсутствии ошибок (написать юнит-тесты хотя бы), и только потом - использовать. Скорость разработки зачастую является более значимым фактором, чем потеря 1-2% производительности приложения в целом, которых никто не заметит.

Это сообщение отредактировал(а) Cтpaнник - 27.5.2009, 10:27
PM MAIL   Вверх
azesmcar
Дата 27.5.2009, 10:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



Цитата(Alexeis @  27.5.2009,  10:10 Найти цитируемый пост)
Для сравнения создайте вектор, например из 1024 байтов и добавьте еще элемент так чтобы было перераспределение и сделайте аналогичные операции руками при помощи new для выделения памяти/memcpy для копирования элементов/memset для инициализации нулями. Думаю скорость будет выше раза в два.

с это чего вдруг? smile 
PM   Вверх
Lazin
Дата 27.5.2009, 10:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



после инстанциирования, алгоритм работы вектора сведется к тому, что квалифицированный программист может написать вручную, лишних действий там выполняться не будет
для некоторых параметров многие шаблоны специализированы, к примеру специализация std:swap для векторов не копирует элементы, а просто меняет местами указатели, или vector<bool> на самом деле не вектор элементов типа bool smile

Добавлено через 3 минуты и 4 секунды
Цитата(Alexeis @  27.5.2009,  10:10 Найти цитируемый пост)
тогда как специальный класс может использовать все возможности того типа с которым он работает

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

Добавлено через 11 минут и 26 секунд
Цитата(Cтpaнник @  27.5.2009,  10:26 Найти цитируемый пост)
Это верно

нет! smile 
Alexis - не понимает о чем он говорит, его представление о шаблонах заканчивается на параметризированых типах, a-la дженерики в .NET. С помощью шаблонов можно делать намного больше и не платить за это уменьшением производительности. Некоторые идиомы с++ вообще не реализуемы без шаблонов.
PM MAIL Skype GTalk   Вверх
Alexeis
Дата 27.5.2009, 11:17 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Цитата(azesmcar @  27.5.2009,  09:28 Найти цитируемый пост)
с это чего вдруг?

  Проведите исследование, зайдите под дебагом в код. При копировании байтиков что будет делать вектор? Использовать 8 бит своего регистра, предварительно очищать верхнюю часть регистра, короче будет порядка 4-5 ассемблерных операций на перенос всего одного байта, тогда как memcpy возьмет цельный регистр разрядности процессора закинет в него сразу 4 элемента (8 элементов) и за одну операцию перекинет его в другой участок памяти. А если глянуть на код наращивания так вообще диву даешься. 
  В том то и дело, что счет идет не на 1-2%, а на 100-200%

Цитата(Lazin @  27.5.2009,  09:30 Найти цитируемый пост)
можно специализировать шаблонный класс для определенных типов и оптимизировать некоторые аспекты его работы, а для других типов использовать обобщенную реализацию

  Этим мало кто занимается, потому что в тот момент когда пишешь шаблон как правило не знаешь всех типов к которым он будет применим. Начинаешь проектировать общее. В последствии менять код шаблона уже не желательно, так как это может повлиять на стабильность его работы.
  Кроме того шаблонный код ориентирован максимально на статическое связывание внутри программы, это уменьшает гибкость в рантайме, ухудшают модульность, увеличивают время компиляции. Попробуйте экспортировать шаблон из DLL. При каждой перекомпиляции модуля будут перекомпилированы все шаблоны которые он использует, не просто заголовки, а их реализация. Можно сказать что шаблонный класс это недокласс.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Lazin
Дата 27.5.2009, 11:29 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



Цитата(Alexeis @  27.5.2009,  11:17 Найти цитируемый пост)
Проведите исследование, зайдите под дебагом в код. При копировании байтиков что будет делать вектор? Использовать 8 бит своего регистра, предварительно очищать верхнюю часть регистра, короче будет порядка 4-5 ассемблерных операций на перенос всего одного байта, тогда как memcpy возьмет цельный регистр разрядности процессора закинет в него сразу 4 элемента (8 элементов) и за одну операцию перекинет его в другой участок памяти. А если глянуть на код наращивания так вообще диву даешься. 

Опять-же, бессовестная ложь smile 
Посмотри что получится в релизе, с оптимизациями и отключенными runtime проверками. И чем тебе не нравится код наращивания?

Цитата(Alexeis @  27.5.2009,  11:17 Найти цитируемый пост)
Этим мало кто занимается, потому что в тот момент когда пишешь шаблон как правило не знаешь всех типов к которым он будет применим.

я привел пример smile 
PM MAIL Skype GTalk   Вверх
azesmcar
Дата 27.5.2009, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



Цитата(Alexeis @  27.5.2009,  11:17 Найти цитируемый пост)

  Проведите исследование, зайдите под дебагом в код. При копировании байтиков что будет делать вектор? Использовать 8 бит своего регистра, предварительно очищать верхнюю часть регистра, короче будет порядка 4-5 ассемблерных операций на перенос всего одного байта, тогда как memcpy возьмет цельный регистр разрядности процессора закинет в него сразу 4 элемента (8 элементов) и за одну операцию перекинет его в другой участок памяти. А если глянуть на код наращивания так вообще диву даешься. 
  В том то и дело, что счет идет не на 1-2%, а на 100-200%


непременно проведу..но вы сперва скажите какая из реализаций СТЛ ведет себя так а то я подозреваю что на нее наткнутся будет весьма сложно. smile 
Цитата

insert
Notes: Causes reallocation if the new size is greater than the old capacity. If no reallocation happens, all
the iterators and references before the insertion point remain valid. If an exception is thrown other than
by the copy constructor or assignment operator of T there are no effects.

покажите мне в стандарте - где сказано что вектор должен копировать используя
Цитата

8 бит своего регистра

и
Цитата

предварительно очищать верхнюю часть регистра


это дело того - кто реализовывал СТЛ. Стандарт не требует вызывать копи-конструкторы во время наращивания вектора, следовательно можно реализовать это и с помощью memcpy.
PM   Вверх
Alca
Дата 27.5.2009, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



VC++ 2008: один и тот же код (с шаблонами и без них), релиз версия - ехе-шники весят одинаково!!!
Получается, что компилер "вырезал" (в exe-шнике без шаблонов) лишний код....

Это сообщение отредактировал(а) Alca - 27.5.2009, 11:51


--------------------
PM WWW ICQ Skype Jabber   Вверх
Alexeis
Дата 27.5.2009, 11:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Цитата(azesmcar @  27.5.2009,  10:31 Найти цитируемый пост)
покажите мне в стандарте - где сказано что вектор должен копировать используя

  В стандарте сказано что вектор штука пипец какая универсальная, и должна работать хоть на 8ми битном проце, хоть на 64х разрядном на любой ОС и на любом компиляторе. Поэтому код копирования будет примерно таким
Код

  for (size_t i = 0; i < oldsize; i++)
    newbuf[i] = T(oldbuf[i]);

  Не нужно слепо верить в возможности оптимизатора, он не настолько умный, чтобы из этого сделать memcpy(newbuf, oldbuf, oldsize);

Добавлено через 5 минут и 54 секунды
Цитата(Alca @  27.5.2009,  10:44 Найти цитируемый пост)
VC++ 2008: один и тот же код (с шаблонами и без них), релиз версия - ехе-шники весят одинаково!!!

  В PE модуле секции выравниваются, минимальное выравнивание 512 байт.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
mes
Дата 27.5.2009, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(Alexeis @  27.5.2009,  10:51 Найти цитируемый пост)

  В стандарте сказано что вектор штука пипец какая универсальная, и должна работать хоть на 8ми битном проце, хоть на 64х разрядном на любой ОС и на любом компиляторе. Поэтому код копирования будет примерно таким

Вот Вам условный код, показывающий возможности шаблонов для выбора подходящей реализации
Код

template <class T> void copy (T * beg, T * end, T * dst)
{
    if (std::tr1::is_pod<T>::value) std::cout << "copy with memcopy for PODs"; 
    else std::cout << "copy in for(;;)";
}
//...
    int * src;
    int *dst;
// ...

    copy (src, src+10, dst);




Это сообщение отредактировал(а) mes - 27.5.2009, 12:05


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


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Цитата(mes @  27.5.2009,  11:02 Найти цитируемый пост)
Вот Вам условный код, показывающий возможности шаблонов для выбора подходящей реализации

  Да я верю что это возможно. Такой подход удобен когда заранее известны все типы, т.е. в статике. Это простой случай. Однако приложение подобно живому существу, начинается от простого, затем заказчик хочет еще что-то добавить, потом изменить работу, потом приспособить для других целей.
  Представим себе ситуацию что сначала было 4 категории для работы с которыми был создан шаблон, все было красиво, потом число категорий увеличилось до 12, уже не очень красиво, но работать еще будет, хотя получилась небольшая бяка, потом задача изменилась так что на этапе компиляции категория с которой пришлось работать шаблону уже неизвестна на этапе компиляции. Все, занавес, переписывание кода.
  Это уже минус к шаблонному проектированию.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
mes
Дата 27.5.2009, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(Alexeis @  27.5.2009,  11:41 Найти цитируемый пост)
 Представим себе ситуацию что сначала было 4 категории для работы с которыми был создан шаблон, все было красиво, потом число категорий увеличилось до 12, уже не очень красиво, но работать еще будет, хотя получилась небольшая бяка, потом задача изменилась так что на этапе компиляции категория с которой пришлось работать шаблону уже неизвестна на этапе компиляции. Все, занавес, переписывание кода.
  Это уже минус к шаблонному проектированию. 

Не сваливайте проблемы неправильного проектирования на шаблоны.

Добавлено через 4 минуты и 48 секунд
Цитата(Alexeis @  27.5.2009,  11:41 Найти цитируемый пост)
 Да я верю что это возможно. Такой подход удобен когда заранее известны все типы, 

речь шла о возможных превосходствах обычных динамических массивов над векторах. Аргументом шло, что при динамических массивах мы можем подбирать нужную реализацию для действия, например для копирования pod-объектов использовать memcopy. В ответ было продемонстрировано, что правильно спроектированный вектор, позволяет делать то же самое, но к тому же еще в автоматическом режиме, разгружая программиста для других задач.



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


Вселенский отказник
****


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

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



Ну как бы еще можно boxing заюзать ;)
И код не будет дублироваться )


--------------------
Сообщество художников Artsociety.ru
PM MAIL WWW   Вверх
Alexeis
Дата 27.5.2009, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Цитата(mes @  27.5.2009,  11:43 Найти цитируемый пост)
речь шла о возможных превосходствах обычных динамических массивов над векторах. Аргументом шло, что при динамических массивах мы можем подбирать нужную реализацию для действия, например для копирования pod-объектов использовать memcopy. В ответ было продемонстрировано, что правильно спроектированный вектор, позволяет делать то же самое, но к тому же еще в автоматическом режиме, разгружая программиста для других задач.

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

  Покажите мне современный компилятор у которого реализация вектора работала указанным выше обазом.

  Поэтому чего бы вы не говорили, за скорость минус. Минус не жирный (сложность алгоритмов не меняется), но все таки минус.



--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
mes
Дата 27.5.2009, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(Alexeis @  27.5.2009,  12:09 Найти цитируемый пост)
  Речь шла, о том что хорошее общее решение не быстрее хорошего частного, а концепция шаблонного проектирования это концепция обобщения на этапе компиляции. Переход обратно к типизации это возврат от общего к частному, т.е. отход от обобщения, который не может использоваться повсеместно, а только в исключительных ситуациях.

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





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


uploading...
****


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

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



Цитата(Alexeis @  27.5.2009,  11:51 Найти цитируемый пост)

В стандарте сказано что вектор штука пипец какая универсальная, и должна работать хоть на 8ми битном проце, хоть на 64х разрядном на любой ОС и на любом компиляторе.

Отлично. Не важно какой там код копирования - но я уверен что там использован максимально быстрый и переносимый код. 
Если вы имеете ввиду что можно написать непереносимый код который быстрее переносимого - я с вами согласен, но ведь

Цитата(Alexeis @  27.5.2009,  12:41 Найти цитируемый пост)
приложение подобно живому существу, начинается от простого, затем заказчик хочет еще что-то добавить, потом изменить работу, потом приспособить для других целей

а потом попросит для итаниума откомпилировать...а тут ваш непереносимый код. smile 
PM   Вверх
Lazin
Дата 27.5.2009, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



единственная проблема с вектором, это то, что он вызывает конструкторы для всех объектов, даже для POD, так-что он может быть медленнее из-за этого, а алгоритм увеличения размера и добавления элемента в конец там вполне себе оптимальны smile 
PM MAIL Skype GTalk   Вверх
mes
Дата 27.5.2009, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(Alexeis @  27.5.2009,  12:09 Найти цитируемый пост)
  Покажите мне современный компилятор у которого реализация вектора работала указанным выше обазом.

любой современный.

вот смотрите на участок кода произвольной стл,  и обратите как из вызова copy получается __copy_trivial  в случае подоходящего типа smile 
и как в одних случаях применяется цикличность, а в других memmove.

 
Код

 template<typename _InputIterator, typename _OutputIterator>
    inline _OutputIterator
    __copy(_InputIterator __first, _InputIterator __last,   _OutputIterator __result, input_iterator_tag)
    {
      for (; __first != __last; ++__result, ++__first)    *__result = *__first;
      return __result;
    }

  template<typename _RandomAccessIterator, typename _OutputIterator>
    inline _OutputIterator
    __copy(_RandomAccessIterator __first, _RandomAccessIterator __last,
       _OutputIterator __result, random_access_iterator_tag)
    {
      typedef typename iterator_traits<_RandomAccessIterator>::difference_type
          _Distance;
      for (_Distance __n = __last - __first; __n > 0; --__n)
    {
      *__result = *__first;
      ++__first;
      ++__result;
    }
      return __result;
    }


  template<typename _Tp>
    inline _Tp*  __copy_trivial(const _Tp* __first, const _Tp* __last, _Tp* __result)
    {
      std::memmove(__result, __first, sizeof(_Tp) * (__last - __first));
      return __result + (__last - __first);
    }

  template<typename _InputIterator, typename _OutputIterator>
    inline _OutputIterator
    __copy_aux2(_InputIterator __first, _InputIterator __last,
        _OutputIterator __result, __false_type)
    { return std::__copy(__first, __last, __result,
             std::__iterator_category(__first)); }

  template<typename _InputIterator, typename _OutputIterator>
    inline _OutputIterator
    __copy_aux2(_InputIterator __first, _InputIterator __last, _OutputIterator __result, __true_type)
    { return std::__copy(__first, __last, __result,  std::__iterator_category(__first)); }

  template<typename _Tp>
    inline _Tp*   __copy_aux2(_Tp* __first, _Tp* __last, _Tp* __result, __true_type)
    { return std::__copy_trivial(__first, __last, __result); }

  template<typename _Tp>
    inline _Tp*   __copy_aux2(const _Tp* __first, const _Tp* __last, _Tp* __result, __true_type)
    { return std::__copy_trivial(__first, __last, __result); }

  template<typename _InputIterator, typename _OutputIterator>
    inline _OutputIterator   __copy_ni2(_InputIterator __first, _InputIterator __last,      _OutputIterator __result, __true_type)
    {
      typedef typename iterator_traits<_InputIterator>::value_type _ValueType;
      typedef typename __type_traits<_ValueType>::has_trivial_assignment_operator _Trivial;

      return _OutputIterator(std::__copy_aux2(__first, __last, __result.base(),     _Trivial()));
    }

  template<typename _InputIterator, typename _OutputIterator>
    inline _OutputIterator
    __copy_ni2(_InputIterator __first, _InputIterator __last,  _OutputIterator __result, __false_type)
    {
      typedef typename iterator_traits<_InputIterator>::value_type _ValueType;
      typedef typename __type_traits<_ValueType>::has_trivial_assignment_operator _Trivial;
      return std::__copy_aux2(__first, __last, __result, _Trivial());
    }

  template<typename _InputIterator, typename _OutputIterator>
    inline _OutputIterator
    __copy_ni1(_InputIterator __first, _InputIterator __last,  _OutputIterator __result, __true_type)
    {
      typedef typename _Is_normal_iterator<_OutputIterator>::_Normal __Normal;
      return std::__copy_ni2(__first.base(), __last.base(),   __result, __Normal());
    }

  template<typename _InputIterator, typename _OutputIterator>
    inline _OutputIterator  __copy_ni1(_InputIterator __first, _InputIterator __last,
           _OutputIterator __result, __false_type)
    {
      typedef typename _Is_normal_iterator<_OutputIterator>::_Normal __Normal;
      return std::__copy_ni2(__first, __last, __result, __Normal());
    }


  template<typename _InputIterator, typename _OutputIterator>
    inline _OutputIterator
    copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
    {
       typedef typename _Is_normal_iterator<_InputIterator>::_Normal __Normal;
       return std::__copy_ni1(__first, __last, __result, __Normal());
    }


Цитата
  Поэтому чего бы вы не говорили, за скорость минус. Минус не жирный (сложность алгоритмов не меняется), но все таки минус.

Надеюсь после рассмотрения вышеприведенного кода, Вы откажетесь от этих слов smile


Это сообщение отредактировал(а) mes - 27.5.2009, 13:55


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


любитель
****


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

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



Цитата(Lazin @  27.5.2009,  12:44 Найти цитируемый пост)
единственная проблема с вектором, это то, что он вызывает конструкторы для всех объектов, даже для POD

у многих стл в частности для инициализации памяти однобайтовых pod последовательностeй, вызывается  std::memset. 


Это сообщение отредактировал(а) mes - 27.5.2009, 14:12


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


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Цитата(mes @  27.5.2009,  12:44 Найти цитируемый пост)
Надеюсь после рассмотрения вышеприведенного кода, Вы откажетесь от этих слов 

   С чего бы это?

  Читайте внимательно. 
Цитата(Alexeis @  27.5.2009,  12:09 Найти цитируемый пост)
хорошее общее решение не быстрее хорошего частного, а концепция шаблонного проектирования это концепция обобщения на этапе компиляции.

Да и с каких пор частный случай доказывает правило? Кроме того данный алгоритм все равно не будет быстрее, просто в данном конкретном случае он приближается к оптимальному. Из этого не следует что все шаблонные алгоритмы будут работать столь же оптимально. 

Цитата(http://ru.wikipedia.org/wiki/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D1%91%D0%BD%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5)

Обобщённое программирование — парадигма программирования, заключающаяся в таком описании данных и алгоритмов, которое можно применять к различным типам данных, не меняя само это описание.
 
  
  Неразумно рассматривать механизм языка в отрыве от его основного назначения. В контексте шаблонов С++ имеет смысл говорить о шаблонах как о важнейшем средстве обобщенного программирования. Применение средства не по назначению является насилием над языком, а потому не может рассматриваться как удачный пример реализации. 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
mes
Дата 27.5.2009, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(Alexeis @  27.5.2009,  13:34 Найти цитируемый пост)
Код

Надеюсь после рассмотрения вышеприведенного кода, Вы откажетесь от этих слов 

   С чего бы это?

С того, что Вам было показано, что правильно разработанный шаблонный класс, справляется со  своей задачей оптимально и универсально.

Цитата(Alexeis @  27.5.2009,  13:34 Найти цитируемый пост)
Да и с каких пор частный случай доказывает правило? 

Это Вы намекаете на то, что подобная технология по подбору подходящей реализации, показанная выше лишь случайность ?!
тогда изучите поближе стл, и убедитесь, что данный подход является правилом и именно это и является преимуществом обобщенного механизма.

Цитата(Alexeis @  27.5.2009,  13:34 Найти цитируемый пост)
Кроме того данный алгоритм все равно не будет быстрее, просто в данном конкретном случае он приближается к оптимальному

Быстрее, чем это возможно ?! а это не входит в список его задач и  никто кроме Вас и не требует  smile
К тому же этого не может и Ваш частный случай.

Цитата(Alexeis @  27.5.2009,  13:34 Найти цитируемый пост)
Из этого не следует что все шаблонные алгоритмы будут работать столь же оптимально. 

Также как и не следует, что любой нешаблонный механизм будет работать оптимально. Рассматривать для сравнения можно лишь правильно спроектированные варианты иначе сравнение лишено смысла.

Цитата(Alexeis @  27.5.2009,  13:34 Найти цитируемый пост)

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

А это вобще непонятно к чему Вы сказали..




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


Эксперт
****


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

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



Шаблоны без параметров бывают?


--------------------
PM WWW ICQ Skype Jabber   Вверх
mes
Дата 27.5.2009, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(Alca @  27.5.2009,  15:55 Найти цитируемый пост)
Шаблоны без параметров бывают? 

бывают, только трудно подобрать задачу где такое было бы необходимо.

выглядeть будет например так :

Код

template <int n> int inc() { return n+1; }
std::cout << inc<5>();



Это сообщение отредактировал(а) mes - 27.5.2009, 21:26


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


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

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



Позвольте привести еще пару плюсов за использование шаблонов:
1) Тут Алексис упомянул, что обобщенный код не может быть лучше\быстрее чем код, заточенный под конкретный случай. Это, канешна, так, если речь идет о т.н. "идеальном программисте". А идеальный программист - это что-то вроде сферического коня в вакууме... не думаю, что в данном обсуждении найдется много товарищей, сумеющих написать код так же грамотно, как это сделано в STL (ну, не будем брать тривиальные примеры типа memset...). Короче, используя готовые шаблоны, вы используете грамотный код, до которого еще додуматься нужно. Я уж не говорю о том, что этот код доступен для изучения и повышения квалификации...
2) Пример  совсем из другой оперы. Представьте, что есть достаточно сложный и широко используемый класс. И вот в недрах реализации этого класса нужно реализовать некоторую функцию (чисто для имплементации) над, скажем, хранимым в классе контейнером. И тип этого контейнера объявлен как private. И тип его элементов тоже. Можно, канешна, написать private функцию и добавить ее в интерфейс многострадального класса. Но как уже было сказано, класс и так достаточно сложный. А функция ерундовая и достаточно общая, типа for_each или find (и нужно таких 5 и все немного разные). И делать ее другом ради доступа к private-типу совсем не хочется. Да и вообще упоминать в интерфейсе тоже. Выход - пишем шаблон с обобщенным контейнером, в безымянном пространстве где-нибудь рядом с местом использования. Сплошные плюсы: инкапсюляция не нарушается, интерфейс не засоряется, код не увеличивается...


--------------------
...
PM   Вверх
Rififi
Дата 27.5.2009, 21:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



плюсы примерно те же, что и в случае секса с девушкой против собственой руки.
PM MAIL   Вверх
Alca
Дата 27.5.2009, 21:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



а если девушка крокодил?


--------------------
PM WWW ICQ Skype Jabber   Вверх
azesmcar
Дата 27.5.2009, 21:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



Цитата(Alca @  27.5.2009,  21:11 Найти цитируемый пост)
а если девушка крокодил? 

К шаблонам это не относится
PM   Вверх
mes
Дата 27.5.2009, 21:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(azesmcar @  27.5.2009,  20:13 Найти цитируемый пост)
а если девушка крокодил? 

К шаблонам это не относится 


Почему не относится ? Среди шаблонов также бывают крокодилы, как и в любом другом коде.
Но вот девушка-стл гораздо опытнее, красивее и безопасней, чем многие самописанные. smile 





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



****


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

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



Цитата(Earnest @  27.5.2009,  19:17 Найти цитируемый пост)
А идеальный программист - это что-то вроде сферического коня в вакууме...

то же самое можно сказать и об идеальном шаблоне.
да идеальный шаблон будет оптимизировать код для каждого типа как если бы это делал идеальный программист, и не будет генерить лишний код. на практике это не так. и это не может быть так, т.к. компилятор глупее человека.
PM MAIL ICQ   Вверх
mes
Дата 27.5.2009, 21:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(GoldFinch @  27.5.2009,  20:28 Найти цитируемый пост)
да идеальный шаблон будет оптимизировать код для каждого типа как если бы это делал идеальный программист, и не будет генерить лишний код. на практике это не так. и это не может быть так, т.к. компилятор глупее человека. 

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

Это сообщение отредактировал(а) mes - 27.5.2009, 21:35


--------------------
PM MAIL WWW   Вверх
azesmcar
Дата 27.5.2009, 21:37 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



Цитата(GoldFinch @  27.5.2009,  21:28 Найти цитируемый пост)
компилятор глупее человека. 

но он ошибается реже...


Цитата(mes @  27.5.2009,  21:17 Найти цитируемый пост)
Почему не относится ? Среди шаблонов также бывают крокодилы, как и в любом другом коде.

имелось ввиду что шаблоны - это не семейство крокодилов smile 
PM   Вверх
Lazin
Дата 27.5.2009, 21:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



Цитата(Alexeis @  27.5.2009,  12:41 Найти цитируемый пост)
Да я верю что это возможно. Такой подход удобен когда заранее известны все типы, т.е. в статике. Это простой случай. Однако приложение подобно живому существу, начинается от простого, затем заказчик хочет еще что-то добавить, потом изменить работу, потом приспособить для других целей. 

у меня складывается впечатление, что ты думаешь о шаблонах, как о компонетах в delphi, я лично не понимаю как такое может быть, приходит заказчик и говорит: "у вас там в качестве параметра шаблона для std::list используется класс Foo, так вот у него нужно убрать конструктор копирования и оператор присваивания" smile 

Цитата(Alexeis @  27.5.2009,  12:41 Найти цитируемый пост)

Представим себе ситуацию что сначала было 4 категории для работы с которыми был создан шаблон, все было красиво, потом число категорий увеличилось до 12, уже не очень красиво, но работать еще будет, хотя получилась небольшая бяка, потом задача изменилась так что на этапе компиляции категория с которой пришлось работать шаблону уже неизвестна на этапе компиляции. Все, занавес, переписывание кода.  Это уже минус к шаблонному проектированию.

в этой ситуации и проявятся приемущества правильно написаного шаблона, код который работал с 4-мя категориями, может без изменений заработать с 12-ю. smile 

Цитата(Alexeis @  27.5.2009,  13:09 Найти цитируемый пост)
Речь шла, о том что хорошее общее решение не быстрее хорошего частного, а концепция шаблонного проектирования это концепция обобщения на этапе компиляции. Переход обратно к типизации это возврат от общего к частному, т.е. отход от обобщения, который не может использоваться повсеместно, а только в исключительных ситуациях.

пример из жизни, шаблон boost::fusion::vector<int, long, double> на самом деле реализован точно так-же как эта структура 
Код

struct Val 
{
    int intval;
    long longval; 
    double doubleval
};

, и почему шаблон должен работать "не так", если он в итоге раскрывается в такую-же точно структуру?
Здесь дело не в шаблонах. Если ты будет писать библиотеку и в ней будет обычный класс - динамический массив, для определенного типа данных. Этот класс будет универсальным, так как ты не знаешь где и как будешь его использовать. Поэтому он будет работать не так как код, специально написаный для определенного случая. Потому-что он универсальный.
С классами из STL то-же самое, они иногда работают "хуже" чем код заточеный под определенный случай, не потому что они шаблонные, а потому что они универсальные. smile

Добавлено через 2 минуты и 54 секунды
Цитата(Lazin @  27.5.2009,  21:50 Найти цитируемый пост)
потом задача изменилась так что на этапе компиляции категория с которой пришлось работать шаблону уже неизвестна на этапе компиляции. Все, занавес, переписывание кода.  Это уже минус к шаблонному проектированию.

а потому что нечего применять статический полиморфизм, там где нужно применять динамический smile 
PM MAIL Skype GTalk   Вверх
azesmcar
Дата 27.5.2009, 21:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



Чувствую смрад религиозной войны. smile 
PM   Вверх
Alexeis
Дата 27.5.2009, 22:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



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


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
mes
Дата 27.5.2009, 22:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(Alexeis @  27.5.2009,  21:12 Найти цитируемый пост)
код шаблонов объемней, сложнее как структурно так и сложнее для понимания по сравнению с кодом класса реализующего тот же функционал для заданного типа.

а не кажется ли Вам что сравнение немножко однобокое ? сравнивать надо не только усилия затраченные на разработку, но и пользу извлекаемую из использования.
Если выгоды нет, то зачем усложнять код ?!  Но если посмотреть например на стл, то сразу видно, что усилия разработчиков с лихвой окупились удобством и качеством  для пользователей.




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


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



Цитата(azesmcar @  27.5.2009,  21:57 Найти цитируемый пост)
Чувствую смрад религиозной войны

запах победы! smile 
Цитата(Alexeis @  27.5.2009,  22:12 Найти цитируемый пост)
А вот еще из минусов, чуть не забыл, код шаблонов объемней, сложнее как структурно так и сложнее для понимания по сравнению с кодом класса реализующего тот же функционал для заданного типа.

даже если он сложнее, то он не эквивалентен фукционально классу, реализующему тот же функционал для заданного типа, поэтому их нельзя сравнивать
к тому-же это не имеет отношения к STL, так как мы пользователи библиотеки а не разработчики smile 
PM MAIL Skype GTalk   Вверх
Alek86
Дата 27.5.2009, 23:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



думаю тут уже говорили о том минусе, что реализацию шаблона из ашника нужно держать в ашнике...

еще минус - при их серьезном использовании вылазят такие ошибки компилятора, о которых и не догадывался. причем иногда (в случае VS 2005 очень редко, но метко), это ошибки именно компилятора, когда он действует не по стандарту

и еще - если один из программистов в команде хорошо разбирается в шаблона и пишет много кода с помощью их, traits'ов и стратегий, то:
1. остальные, кто не так хорошо разбирается в шаблонных заморочках при любой багфиксинге в том коде будут почем материть автора
2. если автор еще не выработал стиль в написании стратегий, helper'ов и т.п., то через месяц при багфиксинге в том коде он сам будет биться головой о стенку

также минусы стл и буста прочувствуются, когда программа будет вести себя не так, как ожидалось и нужно будет продебажить их внутренности. конечно, на 99,999% ошибка будет не в стл иди бусте, а у самого программиста, но поиск этой ошибки будет лежать через сплошные тернии шаблонов, traits'ов и т.п.

но это неизбежное зло. лично я лучшей альтернативы пока не встречал


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


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



критика у вас какая-то примитивная, вот к примеру Александресску делает это правильно, он говорит что концепция итераторов не верна и вместо этого нужно использовать концепцию диапазонов(ranges), это позволило-бы сильно упростить код а так-же добавить функции, которые сейчас сложно реализуемы, например проверку корректности итераторов без падения производительности. С таким дизайном STL как сейчас проверка валидности итераторов(если ее включить) заметно снижает производительность.
Я бы еще хотел что-бы в STL была реализована концепция views. Это что-то вроде алгоритмов, в общем я хотел-бы иметь возможность писать так:
Код

std::transform_view<my_functor_type> view(loooong_sequence.begin(), loooong_sequence.end(), my_functor);
std::transform_view<my_another_functor_type> another_view(gen1.begin(), gen1.end(), my_another_functor);
std::copy(dest, another_view.begin(), another_view.end());

В общем, view это что-то вроде контейнера, элементы которого не хранятся в нем, а вычисляются по требованию. Это позволит реализовать ленивые вычисления в стиле STL, что иногда бывает необходимо. К примеру, когда loooong_sequence не просто контейнер, а сложный объект, который загружает данные по требованию, или когда нельзя загрузить все данные полностью(loooong_sequence это istream_iterator большого файла, который не помещается в память полностью), либо когда последовательность loooong_sequence - бесконечна, а вся логика приложения реализована в функторах, переданных в view.
PM MAIL Skype GTalk   Вверх
andrew_121
Дата 28.5.2009, 08:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


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

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



Эту тему нужно повесить в вики)))
Вот. Читаю, учусь.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
azesmcar
Дата 28.5.2009, 08:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



Цитата(Lazin @  27.5.2009,  22:43 Найти цитируемый пост)
запах победы! smile 

У каждой профессии запах особый smile 

Цитата(Alek86 @  27.5.2009,  23:14 Найти цитируемый пост)
еще минус - при их серьезном использовании вылазят такие ошибки компилятора, о которых и не догадывался. причем иногда (в случае VS 2005 очень редко, но метко), это ошибки именно компилятора, когда он действует не по стандарту

не совсем понятно о чем речь. 

Цитата(Alek86 @  27.5.2009,  23:14 Найти цитируемый пост)
также минусы стл и буста прочувствуются, когда программа будет вести себя не так, как ожидалось и нужно будет продебажить их внутренности. конечно, на 99,999% ошибка будет не в стл иди бусте, а у самого программиста, но поиск этой ошибки будет лежать через сплошные тернии шаблонов, traits'ов и т.п.

обычно чтения докумментации по поведению того или иного класса должно быть достаточно. Если библиотека не соответствует своему описанию - это проблема разработчика библиотеки.

Если научиться читать ошибки стл - все будет в порядке. Они жутко выглядят только для неопытного глаза, если привыкнуть - читается как обычные.

Это сообщение отредактировал(а) azesmcar - 28.5.2009, 09:00
PM   Вверх
Alexeis
Дата 28.5.2009, 09:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Цитата(Lazin @  27.5.2009,  21:43 Найти цитируемый пост)
даже если он сложнее, то он не эквивалентен фукционально классу, реализующему тот же функционал для заданного типа, поэтому их нельзя сравнивать
к тому-же это не имеет отношения к STL, так как мы пользователи библиотеки а не разработчики 

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

Добавлено через 8 минут и 24 секунды
Цитата(azesmcar @  28.5.2009,  07:59 Найти цитируемый пост)
не совсем понятно о чем речь. 

  Думаю смысл в том что все новомодные фичи еще плохо обкатаны, поэтому не стоит торопиться их лепить везде и сразу, поскольку компиляторы пишут тоже люди, которые совершают ошибки. Но шаблонам уже лет 15-20 как минимум, так что основные фичи работают стабильно, нельзя сказать что сами шаблоны нестабильный механизм.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Alek86
Дата 28.5.2009, 09:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Lazin @  28.5.2009,  08:48 Найти цитируемый пост)
критика у вас какая-то примитивная

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

Цитата(azesmcar @  28.5.2009,  08:59 Найти цитируемый пост)
не совсем понятно о чем речь. 

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

Цитата(azesmcar @  28.5.2009,  08:59 Найти цитируемый пост)
Если научиться читать ошибки стл - все будет в порядке.

а если полностью разобраться во внутренностях буста, то все вообще будет отлично smile

Это сообщение отредактировал(а) Alek86 - 28.5.2009, 09:55


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


uploading...
****


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

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



Цитата(Alek86 @  28.5.2009,  09:34 Найти цитируемый пост)
а если полностью разобраться во внутренностях буста, то все вообще будет отлично smile 

на данный момент это будет сложно - так как для буста практически нет книг, плюс он динамически растет и меняется. Он не вошел в стандарт, потому пока что никаких точных данных вам никто не предоставит. А вот с СТЛ такой проблемы нет. Он стандартиризован. Будут несоответствия - кройте матом производителя. smile 
PM   Вверх
mes
Дата 28.5.2009, 09:52 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(Alexeis @  28.5.2009,  08:26 Найти цитируемый пост)
   Применительно к одной отдельно взятой ситуации частная реализация будет проще, если использовать в нескольких ситуациях с разными типами, код шаблона может оказаться проще, а может и не оказаться, ведь отладка шаблонного класса сложнее.


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


Это сообщение отредактировал(а) mes - 28.5.2009, 09:52


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


Эксперт
***


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

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



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


--------------------
user posted image    user posted image
PM MAIL   Вверх
GoldFinch
Дата 28.5.2009, 10:56 (ссылка)    | (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



насчет кривых реализаций -
Код

Cont::iterator e=cont.end();
cont.resize(cont.size()+1);
*e=1;

в MSVC2008 при разыменовании e чтобы проверить границы контейнера
в релиз версии используется assert(this<end()) 
в дебаг версии используется assert(this<_Mylast) , где _Mylast - значение end() сохраненное при создании итератора

в результате прога нормально работает в релизе и падает при попытке отладить
PM MAIL ICQ   Вверх
mes
Дата 28.5.2009, 11:12 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(GoldFinch @  28.5.2009,  09:56 Найти цитируемый пост)
насчет кривых реализаций -

Ваш код потенциально опасен. 

Цитата

resize(size_type sz, T c = T());

  Effects:
        if (sz > size())
          insert(end(), sz-size(), c);
        else if (sz < size())
          erase(begin()+sz, end());
        else
          ; // do nothing

Цитата

 23.2.4.3 
  ... insert ...
  Notes:
    Causes  reallocation  if the new size is greater than the old capac-
    ity.  If no reallocation happens, all the iterators  and  references
    before the insertion point remain valid.

Для того, чтоб  resize не вызвал переаллокацию памяти я предполагаю, что Вы удостоверились, что capacity не меньше new_size.
Ваш итератор не находится before the insertion point, а следовательно он не валиден.






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


uploading...
****


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

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



Цитата(Alek86 @  28.5.2009,  09:52 Найти цитируемый пост)
azesmcar, я именно про процесс отладки
неужели тебе никогда не приходилось отлаживать (в смысле смотреть, что куда девается, а не искать в нем ошибку) какой-нить стандартный поток, ибо после его использования получал не то, что хотел?

не так часто чтобы делать из этого проблему smile

потому и сказал
Цитата(azesmcar @  28.5.2009,  08:59 Найти цитируемый пост)
обычно чтения докумментации по поведению того или иного класса должно быть достаточно

понимаю что человек не идеален, вполне может забыть как ведет себя к примеру вектор в той или иной ситуации. Потому и говорю - обычно.
А в идеале - этого достаточно.
Человек может не знать о том что хранить auto_ptr в контейнерах нельзя. И не исключаю что потом ночами он будет мучать себя и дебагер чтобы понять почему его указатели обнулились, но знающий человек поймет. smile 

Это сообщение отредактировал(а) azesmcar - 28.5.2009, 11:16
PM   Вверх
mes
Дата 28.5.2009, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(azesmcar @  28.5.2009,  10:13 Найти цитируемый пост)
Человек может не знать о том что хранить auto_ptr в контейнерах нельзя. И не исключаю что потом ночами он будет мучать себя и дебагер чтобы понять почему его указатели обнулились, но знающий человек поймет. smile 

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


Это сообщение отредактировал(а) mes - 28.5.2009, 11:26


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


depict1
****


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

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



Из книжечки Мэтью Улисона "Практический подход к решению проблем программирования С++" (стр.483)
Цитата

Дефект: механизм инстанциирования шаблонов в С++ использует принятые аргументы без учета того, как и в какой форме эти аргументы впоследствии применяются внутри шаблонов. Это может привести к генерации неэффективного и/или ошибочного программного кода, поскольку временные экземпляры типа класса могут создаваться по ходу продвижения аргументов по шаблону.




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


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Цитата(zim22 @ 28.5.2009,  10:27)
Из книжечки Мэтью Улисона "Практический подход к решению проблем программирования С++" (стр.483)
Цитата

Дефект: механизм инстанциирования шаблонов в С++ использует принятые аргументы без учета того, как и в какой форме эти аргументы впоследствии применяются внутри шаблонов. Это может привести к генерации неэффективного и/или ошибочного программного кода, поскольку временные экземпляры типа класса могут создаваться по ходу продвижения аргументов по шаблону.

  Моск взорвался  smile 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
zim22
Дата 28.5.2009, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

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



Цитата(Alexeis @  28.5.2009,  11:54 Найти цитируемый пост)
 Моск взорвался    smile 

прочитайте лучше в книжечке. там страниц 10-20 об этом написано. я всё не могу набирать smile

Давайте рассмотрим класс String:
Код

class String {
public:
  typedef std::string const &value_type;
public:
  explicit String(std::string const &value);
  explicit String(char const *value);
public:
  std::string const &GetValue() const;
  // ...
};


Мы можем использовать его с текущим определением Wrapper таким образом:
(примечание от меня: какое определение было текущим я не знаю, поэтому приведу оба)
1 определение Wrapper:
Код

template <typename T>
class Wrapper : public T { 
//... 
};

2 определение Wrapper:
Код

template <typename T>
class Wrapper : public T {
  // ...
public:  
  Wrapper() { }
  template <typename T1>
  explicit Wrapper(T1 t1) : base_class_type(t1) { }
  // ...
};

Использование Wrapper:
Код

typedef Wrapper<String> String_t;
std::string ss("A std::string instance");
String_t s1("A c-style string"); // Нормально
String_t s2(ss); // Нормально, но..

Конструкторы компилируются нормально, и программный код работает так, как ожидается, но имеется скрытый недостаток. Выполнение конструктора s2 приводит к созданию двух копий строки ss там, где мы ожидали и хотели получить лишь одну. Дополнительная копия создается, т.к. компиляторы инстанциируют шаблон на основе передаваемых ему типов аргументов без учета того, как они могли бы использовать внутри него. Таким образом, выполняемая работа по созданию s2 фактически эквивалентна следующему:
Код

Wrapper<String>::Wrapper(String s) : m_value(s)  {}

Это и есть дефект.


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


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



Цитата(zim22 @  28.5.2009,  12:24 Найти цитируемый пост)

Это и есть дефект

это дефект в мозгах программиста, в данном случае программист написал шаблонный конструктор, принимающий один аргумент, но не написал конструктор копирования
PM MAIL Skype GTalk   Вверх
zim22
Дата 28.5.2009, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

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



Цитата(Lazin @  28.5.2009,  12:56 Найти цитируемый пост)
но не написал конструктор копирования

может он и написал, т.к. в приведённом коде Wrapper'a есть строчки вида:
Код

// ...

плюс перед примером написано:
Цитата

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

а пример он уже приводил после этого уточнения. и вы всё-равно думаете, что он мог так протупить? smile

Цитата

Прикрепляемые классы(bolt-ins) - это шаблонные классы со след.свойствами:


  • Они являются производными от своего основного типа параметризации(обычно с открытым доступом к нему).

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

  • Они могут усилить возможности основного типа параметризации путем определения переменных-членов, виртуальных функций и дополнительного наследования непустых типов.




Это сообщение отредактировал(а) zim22 - 28.5.2009, 13:36


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


uploading...
****


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

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



Цитата

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

Да, комитет немало усилий к этому приложил, но микрософту на это разумеется наплевать. Студия 2008 - даже варнинг не выдает.
PM   Вверх
zim22
Дата 28.5.2009, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

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



Цитата(azesmcar @  28.5.2009,  13:58 Найти цитируемый пост)
Да, комитет немало усилий к этому приложил, но микрософту на это разумеется наплевать. Студия 2008 - даже варнинг не выдает.

варнинг не выдаёт, зато выдаёт эррор.
http://forum.vingrad.ru/index.php?showtopi...t&p=1820136


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


uploading...
****


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

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



Цитата(zim22 @  28.5.2009,  14:52 Найти цитируемый пост)

варнинг не выдаёт, зато выдаёт эррор.
http://forum.vingrad.ru/index.php?showtopi...t&p=1820136

дальше этого не проверял smile 
Код

std::vector< std::auto_ptr<int> > apc;

насчет конструктора..интересно это у них случайно так вышло или как? smile 

Это сообщение отредактировал(а) azesmcar - 28.5.2009, 15:02
PM   Вверх
Lazin
Дата 28.5.2009, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



Цитата(zim22 @  28.5.2009,  13:29 Найти цитируемый пост)
а пример он уже приводил после этого уточнения. и вы всё-равно думаете, что он мог так протупить?

во первых, я это не читал(и вообще, кто это?)
во вторых, я подумал, что там вызывается s2(s1), а не s2(ss)
PM MAIL Skype GTalk   Вверх
azesmcar
Дата 28.5.2009, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



добавлю...я эту тему впервые вижу smile 
http://forum.vingrad.ru/index.php?showtopi...t&p=1820136
Цитата

Человек может не знать о том что хранить auto_ptr в контейнерах нельзя

про auto_ptr просто так написал, совпало...ни на кого не намекал smile 
PM   Вверх
Alexeis
Дата 28.5.2009, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Цитата(azesmcar @ 28.5.2009,  14:17)
добавлю...я эту тему впервые вижу smile 
http://forum.vingrad.ru/index.php?showtopi...t&p=1820136
Цитата

Человек может не знать о том что хранить auto_ptr в контейнерах нельзя

про auto_ptr просто так написал, совпало...ни на кого не намекал smile

Но ведь это же неудобно, при работе со списками, сложно следить за памятью. Кстати это касается и shared_ptr тоже?


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
azesmcar
Дата 28.5.2009, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



Цитата(Alexeis @  28.5.2009,  16:11 Найти цитируемый пост)
Но ведь это же неудобно

Удобно, ни удобно...auto_ptr для этого не предназначен.

Цитата(Alexeis @  28.5.2009,  16:11 Найти цитируемый пост)
Кстати это касается и shared_ptr тоже? 

ничего подобного.
Цитата

A resource can be owned by more than one shared_ptr object


Alexeis
проблема использования std::auto_ptr состоит в этом
Код

std::auto_ptr<int> obj(new int);
std::cout << obj.operator ->() << std::endl;
std::auto_ptr<int> tmp = obj;
std::cout << obj.operator ->() << std::endl; //тут указатель хранимый в std::auto_ptr равен 0

а таких кодов в СТЛ немало.
к примеру после сортировки контейнера некоторые ваши данные могут просто напросто потеряться и вместо них появится жирный нул. smile 

Это сообщение отредактировал(а) azesmcar - 28.5.2009, 16:25
PM   Вверх
zim22
Дата 28.5.2009, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

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



Цитата(Lazin @  28.5.2009,  15:09 Найти цитируемый пост)
во первых, я это не читал(и вообще, кто это?)

Досье


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


Бывалый
*


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

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



Хочется высказатся на счет шаблонов:

- При применени шаблонов код растет не всегда. К примеру пишем в программе какое то количство функции, так вот если функция не           
    используется  не факт что компилятор её удалит, а вот с шаблонами он просто не станет её проверять.

- Помню были как то у меня веселья с шаблонамми и dll(копии классов в dll и модуле который использовал dll, код писал не я но мне пришлось 
             дописовать, тогда отладка была совсем не понятной).

- Так же шаблонные код плохо анализируется, хотя писать проще.

--------------------
google.com и это все.
PM MAIL   Вверх
Alexeis
Дата 29.5.2009, 10:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Цитата(DrHex @  29.5.2009,  08:50 Найти цитируемый пост)
- При применени шаблонов код растет не всегда. К примеру пишем в программе какое то количство функции, так вот если функция не           
    используется  не факт что компилятор её удалит, а вот с шаблонами он просто не станет её проверять.

  Неправда, если функция не используется, то компилятор ее всегда удаляет. Dll это другое дело, если функция помечена на экспорт то она всегда будет включена, а вот шаблонную функцию экспортировать не удастся. Может быть получиться если явно инстанциировать, и экспортировать инстанциированную. Но не уверен есть ли такой механизм.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Alca
Дата 29.5.2009, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата

Неправда, если функция не используется, то компилятор ее всегда удаляет

Я такле заметил на VC++ 2008


--------------------
PM WWW ICQ Skype Jabber   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.1979 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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