Ох, и пришло же кому-то в голову задать нам такое задание по С++: сделать иерархию графических объектов, и + уметь сохранять в файл/загружать из файла.
Я посчитал, что в лучших традициях С++ я не буду громождить очередной костыльный велосипед, а возьму готовую библиотеку. На роль этой библиотеки, кроме как serialization из буста, мало что подходило: ведь требуется автоматическая сериализация полиморфных объектов из указателей.
Всё бы хорошо, документация хорошая, за полчаса я усвоил всё, что надо... пока дело не дошло до отладки. Не знаю, у кого как, а я впервые увидел backtrace на 100+ функций, из которых ~80 - бустовские с полным названием символов на 100-300.
Кроме того, в процессе сериализации есть ещё одна засада. Если вы попытаетесь сериализировать объект, тип которого не зарегистрирован (ну бывает, забыли прописать), то будет выдан exception - "type unregistered". И хотя ни черта не понятно, какой тип не зарегистрирован, хотя бы понятно, куда копать.
Но вот если вы забудете регистрацию при десериализации, то segfault в библиотечной функции load_pointer - всё, на что вы можете рассчитывать.
Но я-таки поборол. Набор объектов из файла и обратно ходит прекрасно. Ну и фиг, что кроме этого я ничего не успел - ни отчёта, ни управления, собственно, фигурами на форме. Зато [де]сериализация пашет :)
Я посчитал, что в лучших традициях С++ я не буду громождить очередной костыльный велосипед, а возьму готовую библиотеку. На роль этой библиотеки, кроме как serialization из буста, мало что подходило: ведь требуется автоматическая сериализация полиморфных объектов из указателей.
Всё бы хорошо, документация хорошая, за полчаса я усвоил всё, что надо... пока дело не дошло до отладки. Не знаю, у кого как, а я впервые увидел backtrace на 100+ функций, из которых ~80 - бустовские с полным названием символов на 100-300.
Кроме того, в процессе сериализации есть ещё одна засада. Если вы попытаетесь сериализировать объект, тип которого не зарегистрирован (ну бывает, забыли прописать), то будет выдан exception - "type unregistered". И хотя ни черта не понятно, какой тип не зарегистрирован, хотя бы понятно, куда копать.
Но вот если вы забудете регистрацию при десериализации, то segfault в библиотечной функции load_pointer - всё, на что вы можете рассчитывать.
Но я-таки поборол. Набор объектов из файла и обратно ходит прекрасно. Ну и фиг, что кроме этого я ничего не успел - ни отчёта, ни управления, собственно, фигурами на форме. Зато [де]сериализация пашет :)
- Location:дома
Наконец-то! Выпущено Запланировано сколько-либо значительное обновление GСС-compilers.
Думаю, не нужно объяснять, насколько G++ превосходит большинство других компиляторов.
Для unix-подобных систем это вообще наряду с gcc один из основных компиляторов. По скорости, кроме Intel C++, вряд ли вообще кто-то сможет с ним сравниться.
Кроме того, на нем можно писать и под Винду тоже, чем, я, собственно, сейчас и занимаюсь, спасибо MinGW :)
Собственно, к теме...
Вот несколько новых фич, малых, но полезных:
1) защита от переполнения буферов. Специальный механизм записывает случайное число, во время исполнения программы, в специальное место в стеке. Если во время ret его там не будет, значит - injection, и программа вылетает нафиг. Как-то так :)
2) улучшенная оптимизация под x64 платформу. Сейчас наблюдается повсеместный переход на 64-битные приложения, поэтому данная фича тоже кстати.
3) переделан оптимизационный блок. Это, конечно, находится в стадии тестирования, но уже планируется, что новое ядро Linux 2.8 будет компилироваться на нем. Предварительные тестирования показали, что в отдельных приложениях удалось добиться прироста скорости до 20-30%.
(От себя: это вам не Windows :) исходники доступны, и если хорошо перекомпилить, то и скорость увеличится даже без изменения кода. Попробуйте-ка в Винде сделайте что-нибудь подобное :))
4) в компилятор уже начинают добавлять изменения, которые будут нужны при выходе нового стандарта С++09. Конечно, стандарта еще нет, но список фич, которые 99% будут добавлены в новый стандарт, такие, как интерфейсы, template typedefs и несколько других, уже де-факто утвержден.
Ну и как обычно, пофиксивание всяких мелких багов, которые мне ни о чем не говорят.
Вся взятая инфа, собственно, как и сам компилер, лежат на gcc site :)
Думаю, не нужно объяснять, насколько G++ превосходит большинство других компиляторов.
Для unix-подобных систем это вообще наряду с gcc один из основных компиляторов. По скорости, кроме Intel C++, вряд ли вообще кто-то сможет с ним сравниться.
Кроме того, на нем можно писать и под Винду тоже, чем, я, собственно, сейчас и занимаюсь, спасибо MinGW :)
Собственно, к теме...
Вот несколько новых фич, малых, но полезных:
1) защита от переполнения буферов. Специальный механизм записывает случайное число, во время исполнения программы, в специальное место в стеке. Если во время ret его там не будет, значит - injection, и программа вылетает нафиг. Как-то так :)
2) улучшенная оптимизация под x64 платформу. Сейчас наблюдается повсеместный переход на 64-битные приложения, поэтому данная фича тоже кстати.
3) переделан оптимизационный блок. Это, конечно, находится в стадии тестирования, но уже планируется, что новое ядро Linux 2.8 будет компилироваться на нем. Предварительные тестирования показали, что в отдельных приложениях удалось добиться прироста скорости до 20-30%.
(От себя: это вам не Windows :) исходники доступны, и если хорошо перекомпилить, то и скорость увеличится даже без изменения кода. Попробуйте-ка в Винде сделайте что-нибудь подобное :))
4) в компилятор уже начинают добавлять изменения, которые будут нужны при выходе нового стандарта С++09. Конечно, стандарта еще нет, но список фич, которые 99% будут добавлены в новый стандарт, такие, как интерфейсы, template typedefs и несколько других, уже де-факто утвержден.
Ну и как обычно, пофиксивание всяких мелких багов, которые мне ни о чем не говорят.
Вся взятая инфа, собственно, как и сам компилер, лежат на gcc site :)
- Location:дома
- Music:Кукрыниксы - Колдовство
А день сегодня продолжился тоже весело.
Рано пришел на работу, рано и ушел. Но ушел не домой, а играть в футбол с коллегами. Нас набралось 8 человек, и около 2 часов мы поиграли. Не обошлось без мини-травм.
А рука-то у меня до сих пор полностью не прошла. Плохо.
Дома я засел за класс дерева и все пытался его покрасивее написать. Итого около 2-х часов убил на то, чтобы унифицировать половину функционала. Возрадовался. Но вскоре оказалось, что унифицировать вторую половину будет очень нелегко, поэтому все-таки будут два класса дерева, а не один.
Это есть не очень хорошо, но с этим приходится смириться. G++, однако, работая с вложенными шаблонами, далеко не всегда выдает адекватные объяснения ошибок. Ему, естественно, это простительно, так как другие и этого не умеют, и все же.
Завтра, авось, таки доконаю этот функционал.
Рано пришел на работу, рано и ушел. Но ушел не домой, а играть в футбол с коллегами. Нас набралось 8 человек, и около 2 часов мы поиграли. Не обошлось без мини-травм.
А рука-то у меня до сих пор полностью не прошла. Плохо.
Дома я засел за класс дерева и все пытался его покрасивее написать. Итого около 2-х часов убил на то, чтобы унифицировать половину функционала. Возрадовался. Но вскоре оказалось, что унифицировать вторую половину будет очень нелегко, поэтому все-таки будут два класса дерева, а не один.
Это есть не очень хорошо, но с этим приходится смириться. G++, однако, работая с вложенными шаблонами, далеко не всегда выдает адекватные объяснения ошибок. Ему, естественно, это простительно, так как другие и этого не умеют, и все же.
Завтра, авось, таки доконаю этот функционал.
- Location:дома
- Music:ничего
Итак, пару постов назад я отписал о том, что G++ ну ни в какую не хочет правильно оптимизировать мой код. Вернувшись вчера домой поздненько так вечером, я на свежую голову придумал еще один обходной вариант...
Функция у меня состояла из двух маленьких частей: одна на Asm, вторая собственно на С++. Вторая часть занималась очень простой проверкой результата того, что выдал asm-блок.
Сначала я попробовал забить на асм и переписать весь фукнционал под С++. Код оказался рабочим и очень коротким (2 строки всего-навсего), но оптимизатор не выдал и приблизительно того кода, которого хотел я.
Поэтому я придумал другой выход. С помощью условных прыжков и двух витаминов (:)) я перенес весь функционал функции в Asm-код. Код от этого выглядеть никак лучше не стал и немного разросся в размерах, зато G++ уже не фига пытался оптимизировать по сути, по сему вышеприведенное решение заработало.
Итог: решение, устраивающее меня по всем критичным параметрам, было найдено. Однако прошлый вариант функции был сохранен на будущее, потому как глюки G++ - это вам не что-нибудь... На этом компиляторе столько основано, что если это действительно глюк... то это весьма странно и серьезно.
UPD: Чуть не забыл! Сегодня перед универом я успел заскочить в наш потчтовый отдел. Посылка с Дебианом сейчас у меня, с местом на диске проблема решена, итого осталось только переразбить диск и приступать к инсталляции... Руки уже чешутся, поэтому ждите отчета завтра или сегодня глубокой ночью :)
Функция у меня состояла из двух маленьких частей: одна на Asm, вторая собственно на С++. Вторая часть занималась очень простой проверкой результата того, что выдал asm-блок.
Сначала я попробовал забить на асм и переписать весь фукнционал под С++. Код оказался рабочим и очень коротким (2 строки всего-навсего), но оптимизатор не выдал и приблизительно того кода, которого хотел я.
Поэтому я придумал другой выход. С помощью условных прыжков и двух витаминов (:)) я перенес весь функционал функции в Asm-код. Код от этого выглядеть никак лучше не стал и немного разросся в размерах, зато G++ уже не фига пытался оптимизировать по сути, по сему вышеприведенное решение заработало.
Итог: решение, устраивающее меня по всем критичным параметрам, было найдено. Однако прошлый вариант функции был сохранен на будущее, потому как глюки G++ - это вам не что-нибудь... На этом компиляторе столько основано, что если это действительно глюк... то это весьма странно и серьезно.
UPD: Чуть не забыл! Сегодня перед универом я успел заскочить в наш потчтовый отдел. Посылка с Дебианом сейчас у меня, с местом на диске проблема решена, итого осталось только переразбить диск и приступать к инсталляции... Руки уже чешутся, поэтому ждите отчета завтра или сегодня глубокой ночью :)
- Location:на работе
- Music:Nightwish
