1. C++ / Говнокод #2675

    +144.9

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    class SmoothingModeManager
    {
    public:
    	SmoothingModeManager(Context* context, Gdiplus::SmoothingMode mode = Gdiplus::SmoothingModeHighQuality);
    	virtual ~SmoothingModeManager();
    	
    protected:
    	Context* context_;		
    };
    
    ////////////////////////
    
    SmoothingModeManager::SmoothingModeManager(Context* context, Gdiplus::SmoothingMode mode)
    : context_(context)
    {
    	context_->getCanvas()->SetSmoothingMode(mode);
    }
    
    
    SmoothingModeManager::~SmoothingModeManager()
    {
    	context_->getCanvas()->SetSmoothingMode(Gdiplus::SmoothingModeNone);
    }

    Инициализируем класс и контекст со сглаживанием до конца метода.

    Запостил: Altravert, 26 Февраля 2010

    Комментарии (36) RSS

    • И в чем тут соль?
      Ответить
      • Для вызова метода написан класс. Их там еще 6 штук, подобных. Имхо, нехорошо.
        Ответить
        • Когда необходимо обеспечить парный вызов метода (сначала с одними параметрами, потом с другими - отменяющими первый вызов), лучше таких вот мелких объектов еще ничего не придумано.
          Налицо не говнокод, а недостаток понимания.
          Ответить
          • По-моему лучше просто быть внимательнее, чем подобные шняги. А то потом непонятно почему начинают отрисовываться части со сглаживанием и без.
            Даже укоротить это до context_->smoothingMode(bool) и то понятнее и удобнее. И пусть низкоуровневые товарищи поправят, но вроде как вызвать метод два раза побыстрее, чем создавать для этого экземпляр класса.
            Ответить
            • Быстрее конечно, память же не надо выделять.
              Хотя это тоже вопрос - если этот класс на стеке, то тут уже надо мерять.
              И еще вопрос в том, как компилятор на это посмотрит. Если соптимизирует - то вообще пофигу.
              Ответить
            • > По-моему лучше просто быть внимательнее, чем подобные шняги.
              Подход неправильный.
              Если развить эту мысль - то зачем вообще использовать языки высокого уровня? Лучше просто потребовать от программиста быть повнимательнее. И пусть в машинных кодах программит.

              > А то потом непонятно почему начинают отрисовываться части со сглаживанием и без.
              Заворачивание функций в класс как раз и гарантирует, что при деструкции объекта в обязательном порядке будет вызвана функция, отключающая сглаживание. В результате неразберихи становится гораздо меньше, чем если требовать от программиста вызвать отключалку сглаживания вручную (то return из функции неожиданный сработал, то эксепшен пришел, то программист в чужом коде не разобрался).

              > И пусть низкоуровневые товарищи поправят, но вроде как вызвать метод два раза побыстрее, чем создавать для этого экземпляр класса.
              Напомню, что речь идет о GUI. О каком-таком "быстрее" мы говорим? :) Пара сэкономленных машинных команд - это ничто.

              Создание экземпляра данного класса на стеке - это две операции:
              1. Сохранить указатель на контекст по адресу в стеке
              2. Вызвать метод по указателю.
              Область памяти под объект выделяется в кадре стека - это бесплатно с точки зрения накладных расходов.

              Итак, от "ручного" вызова функции наш объект отличается фактически только одним-единственным присваиванием. Вы ради этой экономии будете заставлять программистов отслеживать парность вызовов по всему коду?
              Ответить
              • надо смотреть асмовый листинг...
                по моему тут все заинлайнится... а если указатель на контекст сделать константным, то и на стеке ничего не будет...
                и виртуальный деструктор не нужен...
                Ответить
                • Наличие виртуального деструктора - единственный прокол в этом коде. Плюс один лишний пойнтер в классе (на _vtbl).
                  Даже вызов деструктора любой более-менее вменяемый компилятор оптимизирует в обычный call.
                  Ответить
                • >а если указатель на контекст сделать константным, то и на стеке ничего не будет...
                  Кто-то такое сказал? const никогда не влияет на оптимизацию.
                  Ответить
                  • совсем не влияет? серьезно? а то что это прямой намек компилятору о том что данные меняться не будут??
                    Ответить
                    • Не намёк. const_cast рулит, и данные будут меняться. ;)

                      А вообще приведи хоть один дизасемблерный листинг, где из-за const произошла оптимизация? Небывает такого.
                      Ответить
                      • Хех. Легко:

                        int a = 5;
                        const int b = 5;

                        printf( "%d\n", a + 5 );
                        printf( "%d\n", b + 5 );

                        Ассемблерный код:

                        movl a, %eax
                        addl $5, %eax
                        movl %eax, 4(%esp)
                        movl $.LC0, (%esp)
                        call printf
                        movl $10, 4(%esp)
                        movl $.LC0, (%esp)
                        call printf

                        В первом случае - честное вычисление, во втором - константа вычислена на этапе выполнения.

                        В случае с константными членами класса с С++, конечно, не все так прямолинейно. При создании объекта на стеке под константный мембер будет отведено место. Но тем не менее кое-какие оптимизации возможны и в этом случае (особенно если класс шаблонный).
                        Ответить
                        • В обоих случаях хороший компилятор подсчитает это на этапе компиляции и не будет городить огород из инструкций с включенной оптимизацией. Чем пользуетесь? Что-за говнокомпилятор?
                          Ответить
                          • Я вижу, вопрос с оптимизируемостью const снят. Это радует.
                            В свете этой радости использованный компилятор, уверяю вас, абсолютно не важен.
                            Ответить
                        • как показывает мне моя практика, лучше лишний раз поставить const, чем лишний раз искать вменяемый компилятор...
                          Ответить
                          • ответил не тому гостю...
                            Ответить
                          • Один раз найти хороший компилятор и всё. :)
                            А const ставить милионы раз. На лицо не оптимальность принятого решения. :)
                            Ответить
                            • новичек? иногда выбор компилятора навязывает платформа... это под виндой их десяток, а под ПС3 он один, и под iPhone - один, и еще бог знает (а консолей и мобильных девайзов сейчас развелось достаточно) где он тоже один...
                              профессионализм как раз заключается в умении писать код а не выбирать компиляторы...
                              Ответить
                              • Для случая, где компиляторы есть - заниматься лишней работой не следует.
                                Ответить
                                • грамотная расстановка const - это не лишняя работа...
                                  Ответить
                                  • Я не индус. Мне за строчки не платят, а за часы.
                                    ;p
                                    Ответить
                                    • Вместо того, чтобы улучшать качество своего кода, ты переваливаешь ответственность на компилятор. Типа, компилятор должен сам разобраться, где тут что, и оптимизировать соответственно.
                                      Это признак непрофессионализма, как совершенно верно заметил pushkoff. Отказ от расстановки const - это прежде всего отказ от документирования собственного кода. Нет const - нет сведений о том, можно ли изменять значение в данном месте кода или нет. Меньше сведений о коде - больше работы придется сделать тем, кто будет поддерживать твой код после тебя.
                                      Не говоря уже о том, что надеяться на интеллектуальность компилятора там, где он проявлять интеллект вовсе даже не обязан - детский сад.
                                      Ответить
                                      • >где он проявлять интеллект вовсе даже не обязан
                                        Обязан. :)
                                        >Типа, компилятор должен сам разобраться, где тут что, и оптимизировать соответственно.
                                        Как признак оптимизации const я раставлять не обязан. Если глупый компилятор соптимизирует мне то, что помечено, как const, а я потом это место const_cast'ом запаганю, то это исключительно глупость компилятора. Если не понятно, то могу привести пример.
                                        >const - это прежде всего отказ от документирования собственного кода
                                        Я где-нибудь сказал, что их не ставлю? Я сказал, что это не имеет отношение к оптимизации.
                                        Ответить
                                        • Детский сад, штаны на лямках.
                                          Ответить
                                          • Взрослый сад, штаны без лямок.
                                            Ответить
                                            • Да, на аргументацию такого уровня трудно возразить.
                                              Ответить
                                      • На себя посмотри. X_X
                                        Ответить
        • О том, что такое RAII и чем оно полезно, знаешь?
          Ответить
    • Аффтар, хватит называть говнокодом то, в чем ты не разбираешься...
      Ответить
      • И с чего ты взял, что я в этом не разбираюсь? И в чем я еще не разбирался раньше?
        Ответить
        • Потому что ты это постишь... этот код пример того как надо делать (кроме виртуального деструктора)...

          вот твой предидущий пост http://govnokod.ru/2657
          Ответить
    • Учи RAII, учи паттерн guard.
      Ответить
    • ну что, говнокодер, помогли исправить баги?
      Ответить

    Добавить комментарий