Re: Какой вариант лучше для обхода полей класса
Добавлено: 09 ноя 2016, 22:20
- Видимо, ты невнимательно прочёл. Неоптимальность unordered_map в данном случае, проявляется не на копировании объектов, а чудовищном оверхеде. Ты же понимаешь, как unordered_map реализована на нижнем уровне? Это хэш-таблица в терминах структур данных. А хэш-таблица с десятком элементов, это как 25-этажный дом с одной заселённой квартирой. Надеюсь, идея понятна.
- Добавление амперсанда в operator Type() поддерживаю. Не доглядел из-за спешки. Копирования не будет, правда. И всё благодаря RVO. Все современные компиляторы его поддерживают. Но ты прав, не стоит полагаться на оптимизатор... к тому же есть очень хитрые случае, когда RVO не сработает.
- Виртуальный деструктор опущен обдуманно. Я не сторонник концепции "сделал хоть один виртуальный метод - делай виртуальный деструктор", хотя знаю людей, который её придерживаются. Виртуальный деструктор нужен для полиморфного удаления объекта, а у нас нигде полиморфного удаление нет. Нет, я понимаю аргументы людей, которые добавляют виртуальный деструктор всегда. Они говорят, что сейчас полиморфного удаления нет, а потом появится, а деструктор добавить забудешь. Тем не менее, предпочитаю занимать оптимизацией даже на таком уровне: не нужно, не добавляй.
- Вариант с лямбдами тоже хорош, но всё же он уступает по скорости прямому доступу. А reinterpret_cast в данном случае абсолютно честен, так как скасченый указатель мы используем только для доступа к указателю на виртуальную таблицу, а он у FieldBase и у любого наследника Field гарантированно расположен по одному и тому же смещению.
- Добавление амперсанда в operator Type() поддерживаю. Не доглядел из-за спешки. Копирования не будет, правда. И всё благодаря RVO. Все современные компиляторы его поддерживают. Но ты прав, не стоит полагаться на оптимизатор... к тому же есть очень хитрые случае, когда RVO не сработает.
- Виртуальный деструктор опущен обдуманно. Я не сторонник концепции "сделал хоть один виртуальный метод - делай виртуальный деструктор", хотя знаю людей, который её придерживаются. Виртуальный деструктор нужен для полиморфного удаления объекта, а у нас нигде полиморфного удаление нет. Нет, я понимаю аргументы людей, которые добавляют виртуальный деструктор всегда. Они говорят, что сейчас полиморфного удаления нет, а потом появится, а деструктор добавить забудешь. Тем не менее, предпочитаю занимать оптимизацией даже на таком уровне: не нужно, не добавляй.
- Вариант с лямбдами тоже хорош, но всё же он уступает по скорости прямому доступу. А reinterpret_cast в данном случае абсолютно честен, так как скасченый указатель мы используем только для доступа к указателю на виртуальную таблицу, а он у FieldBase и у любого наследника Field гарантированно расположен по одному и тому же смещению.