- Видимо, ты невнимательно прочёл. Неоптимальность unordered_map в данном случае, проявляется не на копировании объектов, а чудовищном оверхеде. Ты же понимаешь, как unordered_map реализована на нижнем уровне? Это хэш-таблица в терминах структур данных. А хэш-таблица с десятком элементов, это как 25-этажный дом с одной заселённой квартирой. Надеюсь, идея понятна.
- Добавление амперсанда в operator Type() поддерживаю. Не доглядел из-за спешки. Копирования не будет, правда. И всё благодаря RVO. Все современные компиляторы его поддерживают. Но ты прав, не стоит полагаться на оптимизатор... к тому же есть очень хитрые случае, когда RVO не сработает.
- Виртуальный деструктор опущен обдуманно. Я не сторонник концепции "сделал хоть один виртуальный метод - делай виртуальный деструктор", хотя знаю людей, который её придерживаются. Виртуальный деструктор нужен для полиморфного удаления объекта, а у нас нигде полиморфного удаление нет. Нет, я понимаю аргументы людей, которые добавляют виртуальный деструктор всегда. Они говорят, что сейчас полиморфного удаления нет, а потом появится, а деструктор добавить забудешь. Тем не менее, предпочитаю занимать оптимизацией даже на таком уровне: не нужно, не добавляй.
- Вариант с лямбдами тоже хорош, но всё же он уступает по скорости прямому доступу. А reinterpret_cast в данном случае абсолютно честен, так как скасченый указатель мы используем только для доступа к указателю на виртуальную таблицу, а он у FieldBase и у любого наследника Field гарантированно расположен по одному и тому же смещению.
Какой вариант лучше для обхода полей класса
Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain
- Romeo
- Сообщения: 3126
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Если члены однотипны, то можно перегрузить оператор квадратные скобки:
. А если разнотипны, то зачем их вообще обходить в цикле?
Код: Выделить всё
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.