• Стоит ли использовать private static функции в C++?

    @degs
    Корректный ответ состоит из обьединения двух предыдущих.
    Если у вас один из параметров - обьект этого класса и вам нужен доступ к приватным его членам, то это единственный выход. В остальных случаях из эстетических соображений будет лучше выглядеть свободная функция.
    Ответ написан
    Комментировать
  • В каких случаях лучше использовать lockfree структуры данных, а когда на мютексах?

    @degs
    Это сильно зависит от задачи, в общем случае lockfree алгоритмы позволяют передавать сообщения без блокировки читающего/пишущих потоков и получить задержку < 1 мкс на сообщение. Если у вас именно такие технические требования, то boost::lockfree вероятно единственный портабельный вариант.
    Однако, если вас интересует скорость передачи (а не задержка в терминах мкс/на сообщение), то обычная блокирующая очередь ничем не уступит по параметру собщений/сек.
    Еще один вариант применения - если вам нужно как можно быстрее освободить пишущий поток (типичный пример - логгер), тогда неблокирующая очередь - самый оптимальный алгоритм.
    Обратите также внимание на то что boost::lockfree, как и все другие реализации, не предоставляет способа синхронизации читающего потока, то есть он будет непрерывно работать тратя ресурсы CPU. Если же вы искуственно его синхронизуете, например на мьютексе, то lockfree очередь выродится до обычной блокирующей. Еще из недостатков, существующая имплементация жестко ограничивает типы данных в очереди, простые данные с побитовым копированием и без конструктора, это очень ограничивает варианты дизайна.
    Моя рекомендация - если у вас нет очень жестких специфических требований на пердачу данных, используйте обычную очередь.
    Ответ написан
    3 комментария
  • Доступ к методу c++ объекта из c

    @degs

    Все прекрасно линкуется (gcc-4.6)

    iBolit# make
    g++    -c -o blah.o blah.cc
    g++    -c -o wrap.o wrap.cc
    cc    -c -o main.o main.c
    cc   blah.o wrap.o main.o   -o blah
    iBolit# ./blah
    Blah!
    iBolit# 
    
    Я специально сделал main.c чтобы проверить линковку между C и C++ модулями, все работает. Скорее всего у вас что-то в процессе компиляции/линковки неправильно, например незаслуженно забыт файл blah.o при линковке.
    На самом деле была ошибка в коде, пропущена ; после декларации класса blah в файле blah.h, но это дает ошибку при компиляции а не линковке.

    Ответ написан
    Комментировать