• Оптимизирует ли gcc геттеры/сеттеры без inline?

    @RPG
    Если тело геттера/сеттера находится в области видимости его использования, то вполне подставляет: goo.gl/zry8bv. Для этого достаточно флага -O2. Впрочем, пример натянутый и далёк от реальности.

    Однако в случае сложного кода (более 1 файла) перед разработчиком встанет выбор: оставить тело функции в заголовочном файле или же компилировать реализацию отдельно в другом cpp-файле. Если в заголовочном файле тела функции не окажется, компилятор будет вынужден сводить объектный код функции вместо исходного и нужно включить флаг -flto при компиляции.

    Далее уже всё зависит от того, что вы делаете - библиотеку или свою собственную программу. В библиотеке методы как правило прячут и не делают их inline, чтобы не вынуждать клиентские программы к перекомпиляции при изменении методов класса.

    Мой совет - оставьте этот вопрос до тех пор, пока вы не обнаружите свой геттер или сеттер в верхней строчке профилировщика.

    UPD. Эксперимент с новым компилятором (gcc 4.9) показывает, что флаг -O2 -flto таки проводит межпроцедурную inline-оптимизацию автоматически, если это возможно. Второй из доступных мне компиляторов (gcc 4.4) этого делать не умеет - тут ещё нет поддержки LTO. Соответственно при использовании новых компиляторов действительно смысла в inline нет. Вот здесь файлы для тестирования: https://gist.github.com/scriptum/57ae4d2524d42fccb494
    Ответ написан
    1 комментарий
  • Kак сортировать стрoку, которая содержит 0 и 1?

    Taraflex
    @Taraflex
    Ищу работу. Контакты в профиле.
    Я, наверное, чего-то недопонял, но почему просто не подсчитать количество 1 и 0 в строке и не вывести потом сразу сначала все 0, а потом 1.
    Ответ написан
    1 комментарий
  • Linux: подмена имени бинарника - какие непредсказуемые последствия?

    @dykky
    1. Это абсолютно нормальный подход.
    2. Если вызов проги - последнее действие скрипта, то лучше делать не подпроцесс, а замещать текущий процесс прогой, что экономит немного памяти и сохраняет отношения parent-child для сигналов (т.е. после отработки скрипта родительская прога получит абсолютно такое же состояние дочернего процесса, как и до подмены проги на скрипт):
    #!/bin/sh
    
    # некоторые действия: 
    # обработка входных параметров, 
    # установка дополнительных переменных окружения, 
    # и т.д. ...
    
    exec path_to_dir/progX_orig $*

    3. Параметры в прогу лучше передавать так, как они были переданы в скрипт, а конструкция $* произведёт репарсинг аргументов.
    Т.е. последняя строчка, с учётом п.2, на мой взгляд, должна выглядеть так
    exec path_to_dir/progX_orig "$@"
    Ответ написан
    Комментировать
  • Как вычислить погрешность, при которой два числа с плавающей точкой можно считать равными?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Если речь идёт об абстрактной математике, то надо рассматривать представление плавающего типа (float, double, long double) в конкретной архитектуре. В большинстве случаев используется IEEE 754-1985. Скажем, для float32 в нормализованной форме точность - то есть единица младшего разряда мантиссы - в зависимости от экспоненты может быть от 1.175494351×10−38 до 3.402823466×1038.

    Если же речь о прикладных задачах, то точность выбирается исходя из модели процесса. Скажем, при поиске кратчайшего маршрута поездки достаточно точности в десяток метров, а при парковке нужны, как минимум, сантиметры.
    Ответ написан
    Комментировать
  • Переменное число параметров и шаблон функции

    @malerix
    Мне кажется, вот здесь ошибка:
    va_start(arguments, argumentNumber);
    Второй аргумент макроса va_start - это последний известный аргумент в функции. Компилятор даже вам об этом сообщает.
    Например:
    int magicFunction(int a, int b, int c, ...) {
        va_list args;
        va_start(args, c);
       //...
    }

    Следовательно, вам надо записать так:
    va_start(arguments, _col);
    Кстати, если у вас есть возможность воспользоваться отладчиком, посмотрите при вызове этой функции стек, и сравните адреса, в которых расположены argumentNumber и _col. Так что первый вариант (c int) тоже нерабочий.
    Ответ написан
    1 комментарий
  • Основание логарифма при оценке сложности алгоритма nlog(n)

    @throughtheether
    human after all
    Одно из свойств этой нотации - отбрасывание констант перед членами, а также младших (менее быстро растущих) членов. Кроме того, log[base=a](N)=log[base=b](N)/log[base=b](a), т.е. при смене основания логарифма эффективно меняется константа перед соответствующим членом, что в целом не учитывается ('подавляется') О-нотацией.
    Ответ написан
    Комментировать
  • Как в C++ создать массив структур неизвестной длины внутри функции?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Ошибка:
    scanf("%s", *books[i].name); Вы вместо указателя на имя передаёте значение первого символа, правильно:
    scanf("%s", books[i].name);
    Ошибка:
    scanf("%d", books[i].price);
    scanf("%d", books[i].page_n);
    scanf("%d", books[i].pubhouse.year);
    Вы вместо адреса переменной передаёте её значение, правильно:
    scanf("%d", &(books[i].price));
    scanf("%d", &(books[i].page_n));
    scanf("%d", &(books[i].pubhouse.year));
    Ответ написан
    Комментировать
  • Как дать понять пользователю, что функция выделила память (С++)?

    @alexanius
    Избегайте таких ситуаций. В C++ множество усилий было направлено на то чтобы избавиться от гуляющих указателей. Используйте контейнеры (vector, list) или умные указатели (std::shared_ptr).
    Ответ написан
    2 комментария
  • Ubuntu - процесс убивается ядром из-за потребления ресурсов. Можно ли разрешить ему выполняться долго (или частями)?

    lesovsky
    @lesovsky
    System engineer and PostgreSQL DBA
    OOM Killer приходит когда ядру нехватает памяти, видимо ваш процесс слишком много потребляет памяти))).
    Тут есть два варианта:
    1. установите -1000 в /proc/$pid/oom_score_adj (при таком раскладе OOM прийдет но грохнет кого-то другого с меньшим значением oom_score_adj).
    2. увеличьте своп. Таким образом объем виртуальной памяти увеличится, и при выполнении вашей задачи вы скорей всего начнете свопиться, но зато OOM не наступит. (И тратиться на железо не придется)

    Ну и мониторьте этот ваш процесс, почему же он потребляет столько памяти? может тупо течет?
    Ответ написан
    Комментировать
  • Как написать самый простой цикл на bash?

    tmin10
    @tmin10
    может запустить так будет проще: ./script || ./script ?
    Ответ написан
    Комментировать
  • Как найти сумму углов n-многоугольника?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Вы выбрали неудачный метод проверки на выпуклость. Из-за погрешности при расчётах углов велики шансы получить неточное значение, причём погрешность при суммировании будет накапливаться.
    Правильный метод - проверка знаков векторных произведений соседних отрезков. Для выпуклого многоугольника все произведения будут иметь один и тот же знак, зависящий от направления обхода.
    #define sign(x) ((x) == 0 ? 0 : ((x) > 0 ? 1 : -1))
    #define vmul(i,j,k) = ((x[(j)]-x[(i)])*(y[(k)]-y[(j)])-(x[(k)]-x[(j)])*(y[(j)]-y[(i)]))
    bool function isConvex(double *x, double *y, int n) {
        S = sign(vmul(n-2, n-1, 0));
        if ((S1 = vmul(n-1, 0, 1)) != 0 && sign(S1) != S)
            return false;
        for (int i = 0; i < n-2; i++)
            if ((S1 = vmul(i, i+1, i+2)) != 0 && sign(S1) != S )
                return false;
        return true;
    }

    Контроль на совпадение точек (Pi = Pi+1) или (Pi = Pi+2) добавьте сами.
    Ответ написан
    Комментировать
  • Git и теневая бухгалтерия: как восстановить данные?

    dizballanze
    @dizballanze
    Software developer at Yandex
    Очень просто будет восстановить, нужно просто посмотреть в reflog.
    Ответ написан
    Комментировать
  • Как перенаправить stderr в bash через функцию?

    powerthrash
    @powerthrash Автор вопроса
    Такой вариант не подходит. Дело в том, что перенаправление должно быть именно в функции. Скрипт довольно объемный, для всех команд отдельно прописать 2>/tmp/error.log будет не совсем рационально.
    Ответ написан
    1 комментарий
  • Какие не технические книги оказали большое воздействие на вас?

    exponentum
    @exponentum
    Роберт М. Персинг. Дзен и искусство ухода за мотоциклом.
    Джерод Даймонд. Ружья, микробы и сталь.
    Ответ написан
    Комментировать
  • Как правильно ставить задачи программистам?

    @Vampiro
    1. не устраиваться работать подобным образом.
    2. подойти к программистам с макетом и функциональными требованиями, и обсудить с ребятами как лучше по их мнению реализовать тот или иной функционал. Сайт должен выполнять какую-то роль, там и есть интерактив.
    2.а. Постараться в процессе обсуждения выделить "куски" независимых частей и обсудить возможность использования уже готовых кусков кода.
    3. если на этапе два программисты будут говорить, что все нужно писать с нуля, что задача уникальная и процесс займет полгода-год - уволить программистов, это недообученные студенты. Вы должны услышать от них ключевые слова (Yii, codeigniter, "рельсы" или им подобные). Кстати, если услышите "Битрикс" - тоже можете менять, скорее всего они также раньше работали маркетологами )))))))

    ЗЫ. Спасибо, что не устроились врачом)
    Ответ написан
    Комментировать
  • Как вызвать внешний скрипт на PHP с параметрами?

    avalak
    @avalak
    В принципе @DOC_tr прав, но:
    1. Запускать php от root не надо. Вообще не надо.

    Если вы имеете ввиду что вроде - запускаем скрипт, он просит ввести судовский пароль и выполняем команду, то так сделать нельзя

    2. Так сделать можно. Ключи -A, --askpass
    system('SUDO_ASKPASS=/path/to/askpass/askpass sudo -A whoami');

    #!/usr/bin/env bash
    #/path/to/askpass/askpass
    echo "Pa$$word"

    про askpass
    -A, --askpass
    Normally, if sudo requires a password, it will read it from the user's terminal. If the -A (askpass) option is specified, a (possibly graphical) helper program is executed to
    read the user's password and output the password to the standard output. If the SUDO_ASKPASS environment variable is set, it specifies the path to the helper program. Other‐
    wise, if sudo.conf(5) contains a line specifying the askpass program, that value will be used. For example:
    # Path to askpass helper program
    Path askpass /usr/X11R6/bin/ssh-askpass

    If no askpass program is available, sudo will exit with an error.



    3. Можно разрешить запускать скрипт без пароля (NOPASSWD).
    Ответ написан
    Комментировать
  • Сколько существует различных уникальных подпоследовательностей из последовательности цифр длиной N?

    Mrrl
    @Mrrl
    Заводчик кардиганов
    Хорошая задачка, жаль, что я её раньше не заметил.
    Решение за O(N):
    static long nways(string seq) {
        long[] sum=new long[10];
        long cursum=1;
        foreach(char c in seq) {
            int d=c-'0';
            long x=cursum-sum[d];
            sum[d]=cursum;
            cursum+=x;
        }
        return cursum-1;
    }
    Ответ написан
    1 комментарий
  • Как в Git слить ветку, образованную от другой ветки, с мастером?

    artzub
    @artzub
    Программист
    Rebase как раз и сделает так что головой ветки experiment как раз и станет последний коммит m11 в master.

    $ git init
    $ echo 111 > 1.txt
    $ git add .
    $ git commit -m "m10"
    $ git checkout -b server
    $ echo ser >> 1.txt
    $ git commit -am "s11"
    $ echo ser1 >> 1.txt
    $ git commit -am "s12"
    $ echo ser2 >> 1.txt
    $ git commit -am "s13"
    $ echo ser3 >> 1.txt
    $ git commit -am "s14"
    $ echo ser4 >> 1.txt
    $ git commit -am "s15"
    $ git checkout -b experiment
    $ echo exp1 >> 1.txt
    $ git commit -am "e1"
    $ git checkout server
    $ echo ser5 >> 1.txt
    $ git commit -am "s16"
    $ git checkout master
    $ git merge server
    $ git checkout experiment
    $ git rebase master
    # будут конфликты, решаем их
    $ git mergetool
    $ git rebase --continue
    $ gitk --all


    QytqLXY.png
    Ответ написан
    Комментировать
  • Как расставить шесть чисел так, чтобы сумма первых трех была примерно равна сумме остальных?

    @vans239
    Что-то вы преувеличили количество необходимых перестановок. Выбор левой тройки однозначно определяет выбор правой тройки (а также ее сумму). Поэтому всего необходимо перебрать 6!/(3!*3!) = 20. А это уже мало
    Ответ написан
    1 комментарий