Какой вариант лучше для обхода полей класса

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

09 ноя 2016, 22:20

- Видимо, ты невнимательно прочёл. Неоптимальность unordered_map в данном случае, проявляется не на копировании объектов, а чудовищном оверхеде. Ты же понимаешь, как unordered_map реализована на нижнем уровне? Это хэш-таблица в терминах структур данных. А хэш-таблица с десятком элементов, это как 25-этажный дом с одной заселённой квартирой. Надеюсь, идея понятна.

- Добавление амперсанда в operator Type() поддерживаю. Не доглядел из-за спешки. Копирования не будет, правда. И всё благодаря RVO. Все современные компиляторы его поддерживают. Но ты прав, не стоит полагаться на оптимизатор... к тому же есть очень хитрые случае, когда RVO не сработает.

- Виртуальный деструктор опущен обдуманно. Я не сторонник концепции "сделал хоть один виртуальный метод - делай виртуальный деструктор", хотя знаю людей, который её придерживаются. Виртуальный деструктор нужен для полиморфного удаления объекта, а у нас нигде полиморфного удаление нет. Нет, я понимаю аргументы людей, которые добавляют виртуальный деструктор всегда. Они говорят, что сейчас полиморфного удаления нет, а потом появится, а деструктор добавить забудешь. Тем не менее, предпочитаю занимать оптимизацией даже на таком уровне: не нужно, не добавляй.

- Вариант с лямбдами тоже хорош, но всё же он уступает по скорости прямому доступу. А reinterpret_cast в данном случае абсолютно честен, так как скасченый указатель мы используем только для доступа к указателю на виртуальную таблицу, а он у FieldBase и у любого наследника Field гарантированно расположен по одному и тому же смещению.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
Сионист
Сообщения: 1077
Зарегистрирован: 31 мар 2014, 06:18

22 мар 2017, 08:39

Если члены однотипны, то можно перегрузить оператор квадратные скобки:

Код: Выделить всё

class TVector
{
 public:
 double x;
 double y;
 double z;
 TVector operator + (const TVector &v)
 {
  TVector r;
  r.x=x+v.x;
  r.y=y+v.y;
  r.z=z+v.z;
  return r;
 }
 TVector operator - (const TVector &v)
 {
  TVector r;
  r.x=x-v.x;
  r.y=y-v.y;
  r.z=z-v.z;
  return r;
 }
TVector operator * (const double &v)
 {
  TVector r;
  r.x=x*v;
  r.y=y*v;
  r.z=z*v;
  return r;
 }
friend TVector operator * (const double &d, const TVector v)
 {
  TVector r;
  r.x=d*v.x;
  r.y=d*v.y;
  r.z=d*v.z;
  return r;
 }
TVector operator / (const double &v)
 {
  TVector r;
  r.x=x/v;
  r.y=y/v;
  r.z=z/v;
  return r;
 }
 double & operator [] (uint8_t i)
 {
  swittch (i%3)
  {
   case 0: return x;
   case 1: return y;
   case 2: return z;
  }
 }
}
. А если разнотипны, то зачем их вообще обходить в цикле?
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Ответить