Ответы пользователя по тегу C++
  • Ошибка сегментирования?

    @nirvimel
    Первый момент: То, что где-то возникает ошибка сегментирования - само по себе не говорит ни о чем. Так код не анализируется (и тем более, генераторы так не пишутся). Нужно под отладчиком рассматривать эту ошибку детально: в каком месте, откуда шел вызов, что там со стеком, что с указателями. и.т.д.

    Второй момент: Обратную польскую нотацию удобно вычислять прямо на вершине стека (но гораздо быстрее все же на регистрах, пока регистров хватает). Для всего остального выделяются локальные переменные в стековом фрейме, например (но все же и тут следует максимально задействовать регистры).

    Третий момент: Что такое сопроцессор. Далее по ссылкам.

    P.S.: Почему не LLVM? Зачем еще один велосипед?
    Ответ написан
  • Каким способом сделать свой графический векторный редактор?

    @nirvimel
    легко будет сделать такое из программ с открытым кодом: Inkscape, Sk2.0, Skensil?

    Нет.
    Гораздо легче будет написать консольный скрипт, который берет на вход файл с картинкой в векторном формате, предварительно подготовленной в профессиональном редакторе, при помощи поворотов и отражений, делает из нее снежинку, и сохраняет результат в выходной файл.
    Ответ написан
    4 комментария
  • Что выбрать с++, с или go для алгоритма?

    @nirvimel
    А я подобные числодробилки пишу на Python (не спешите смеяться) с применением Numba.
    700 млн * 64бит == 5.6Гб памяти. У меня столько нет, поэтому я возьму половину.
    Итак, выборка 100 тысяч 64-битных значений из 350 миллионов пролетает за 0.315 секунд, значит с 700 миллионами я почти уложился бы в 0.6 секунд. Все это на довольно дешевом Pentium.
    Это явно предел производительности железа и никакие ассемблеры не смогут ускорить решение этой задачи (более, чем на несколько процентов).
    import numba as nb
    import numpy as np
    import time
    
    max_value = np.iinfo(np.intc).max
    
    
    @nb.jit(nopython=True)
    def search(src, dst):
        src_size, = src.shape
        dst_size, = dst.shape
        factor = max_value / src_size * dst_size
        dst_ptr = 0
        for src_ptr in range(src.size):
            value = src[src_ptr]
            if value < factor and dst_ptr < dst_size:
                dst[dst_ptr] = value
                dst_ptr += 1
    
    
    def search_and_time_it(from_size, to_size):
        src = np.random.randint(max_value, size=from_size)
        dst = np.empty((to_size,))
        t1 = time.time()
        search(src, dst)
        t2 = time.time()
        print('search {0:,d} values from {1:,d} takes {2:.3f} seconds'.format(to_size, from_size, t2 - t1))
    
    
    # search 100 000 values from 350 000 000
    search_and_time_it(350 * 1000 * 1000, 100 * 1000)

    Результат:
    search 100,000 values from 350,000,000 takes 0.315 seconds
    Ответ написан
    4 комментария
  • Выбор языка для многопоточного приложения под linux?

    @nirvimel
    C - Плюсы: Возможность выжать максимальную скорость из железа.
    Минусы: При переходе с динамических скриптов (типа, упомянутого в вопросе, PHP) может несколько шокировать своей многословностью и необходимостью явно описывать каждую мелочь, которая в других языках выводится неявно.
    Java - Плюсы: Автоматическая сборка мусора сильно облегчает жизнь и смягчает шок при переходе с динамических скриптов. Гениальный JIT - позволяет сократить отставание от голого железа в скорости (в лучшем случае) до 30%-50% (по сравнению с отставанием в разы и десятки раз для динамических скриптов).
    Минусы: Чтобы воспользоваться всей мощью JIT, требуется глубокое понимание принципов его работы и отказ от использования объектов (основной фишки Java) в глубине самых нагруженных циклов.
    C++ - Разные люди по-разному используют его. Кто-то на нем пишет в стиле C, получает быстродействие чистого C и презрение истинных C++совцев. Кто-то на нем пишет в стиле Java и получает более компактный код, но и быстродействие как у Java. На самом деле на этом языке можно писать красивые, элегантные и не уступающие в быстродействии программы, но на это уйдут годы обучения (речь не о синтаксисе языка и не о стандартной библиотеке).
    Ответ написан
    3 комментария
  • Компиляция только для одной платформы?

    @nirvimel
    В общем случае - да, лучше перекомпилировать.
    Но это зависит не от названия дистрибутива, а от версий конкретных библиотек от которых зависит проект. Некоторые различия версий допускают бинарную совместимость зависимых пакетов, некоторые - нет. Поэтому для каждого (скомпилированного) бинарного пакета всегда четко устанавливается допустимы диапазон версий библиотек от которых он зависит. Это означает, что на этом диапазоне пакет протестирован, работает корректно и может быть перенесен в любой debian-based дистрибутив при условии соответствия версий библиотек, иначе он не установится.
    Ответ написан
    1 комментарий
  • Публичные базы с описанием уязвимостей?

    @nirvimel
    Лента уязвимостей: www.securitylab.ru/vulnerability (там же есть подписка).
    Лента + база + хороший поиск: www.rapid7.com/db/modules
    Ответ написан
    Комментировать
  • Как раскрасить notepad?

    @nirvimel
    D' Normalization расписал все правильно, только в действительности все несколько сложнее. Функции создания окна (меню и все элементы управления - тоже окна; windows же) нигде не принимают цвет через параметр. По умолчанию окна отрисовываются в цветах системной "темы". Чтобы переопределить цвета, надо перехватывать WndProc соответствующего окна, в нем на событие WM_PAINT устанавливать цвет Pen и Brush, пересылать сообщение оригинальному обработчику и надеяться на то что он сам не переопределяет Pen и Brush на каждый вызов WM_PAINT.
    Придется дописывать много кода, компилировать его так что-бы в нем или совсем не было абсолютных адресов (относительные short jumps) или все абсолютные адреса точно попадали в ту область, в которую предполагается вставка. Тут уже без ассемблера не обойтись (сколько же на Тостере за последнее время вопросов: "Где ассемблер незаменим?").
    Далее идет внедрение кода, как у вирусов. На эту тему можно много литературы найти. Если коротко, то есть два варианта: 1) дописать свой код в "хвост" секции кода, если поместится; 2) создать еще одну секцию кода в конце файла, это вариант открывает больше возможностей, но большинство антивирусов будут ругаться на такой exe-шник.
    Потом найти точку для патча, вырезать оттуда часть кода (например, вызов api-функции с подготовкой аргументов), перенести в свой код, а в той точке пропатчить что-то типа call our_code_block \ nop \ nop \ nop ....
    В общем задачка очень серьезная и с наскока такое не решается.
    Ответ написан
    1 комментарий
  • Как разобраться в исходном коде такого проекта как Mysql?

    @nirvimel
    Как вообще люди разбираются с такими проектами как Mysql, где 20К строк на файл

    Эти люди из Oracle быстро разобрались, что они могут потерять работу, если кто-то кроме них самих сумеет разобраться в их коде.
    Ответ написан
    1 комментарий