| tozhe_skazo4nik ( @ 2009-05-13 12:32:00 |
Всё-таки, стандарт С++ 99-го года попытался убрать сложность указателей, введя ссылки. И это здорово. К сожалению, они остановились на пол-пути. К сожалению, ссылка так и осталась недоделанной. Теперь я могу сказать об этом отчётливо, поскольку фреймворк, на котором я работаю, активно использует ссылки (ни одного new/delete в программе без потери производительности).
Что же они упустили, с моей точки зрения, в С++ :
- Ссылки нельзя переинициализировать. Скажем, если класс обменивается сообщением с объектом, инициализируемым во время, например, десериализации из XML. Так вот, я не могу сделать этот член ссылкой. Потому что инициализируется она обязательно в списке инициализации конструктора. То есть приходится делать указатель, там где без него можно было обойтись. В конечном итоге, я думаю что ссылка должна изначально быть неявным NULL (с выбросом ASSERT в отладочной версии при попытке обращения), и позволять (пере)инициализироваться при желании.
- Для ссылок нельзя выполнить виртуальный вызов. Вместо того, чтобы проходить по адресу в таблице виртуальных функций var._vtable[ID_Foo](...), компилятор автоматически вызывает var.Type::Foo(...). А ведь это неправильно: фактически, ссылка это ведь указатель, а значит правильнее было бы сохранять виртуальные вызовы.
- Отсутствие поддержки pick behaviour и moveable типов. Язык не приветствует ни в каком виде разрушающие операторы= и разрушающие "копирующие конструкторы". А зря. Если расположить в правильных местах, это увеличит производительность в разы. Moveable - это конечно тот ещё хак, но и он экономит (правда, конкретно его не замерял).
- Нет возможности на этапе компиляции взять тип аргумента. Это зачастую может быть очень неудобно. В той библиотеке "альтернативной многопоточности", которую я пишу, это бы очень помогло. В этом случае основной вызов вида visualizer.Request(&Visualizer::Upd
ate, upData); можно бы было упростить.