• Как правильно пользоваться разделителем кода для Windows и linux?

    @vanyamba-electronics
    Vitaly,
    Удачи с производительностью, потреблением памяти и доступом к нативным фичам.


    Удачи с инвесторами, сопровождением продукта и в особенности с нативными фичами.
  • Как правильно пользоваться разделителем кода для Windows и linux?

    @vanyamba-electronics
    Vitaly, Qt 5 - это JavaScript. Неплохо работает, кстати. Делал на нём демку, когда ходил на собеседование.
    Я не знаю ни одного кросс-платформенного проекта, написанного на C++ под Qt.
    Телеграм - это тонкий клиент. Тонкого клиента можно написать даже на JavaScript в браузере, и будет работать. Вряд ли серверная часть Telegram написана на С++.
  • Как правильно пользоваться разделителем кода для Windows и linux?

    @vanyamba-electronics
    Vitaly, приведите пример подобного приложения на C++, я может просто не понимаю вопрос.
  • Как реализовать кастомный тип данных в c++ без использования нативной системой типов?

    @vanyamba-electronics
    jcmvbkbc, я спросил у этого парня потом, что делает функция mlock. Она ведь пытается физическую память себе заблокировать.
    Он мне дал почитать статеечку из USENET, где разработчик менеджера памяти объясняет, что по какой-то там хитрой причине винды могут при свопе страниц перемещать страницы в другое место, чтобы новому процессу дать в памяти несегментированное пространство с быстрым доступом. Так получается быстрее и прекраснее.
    Но при этом сами процессы должны винде указать, что данную память не нужно никуда двигать, а если она подверглась свопу, то нужно вернуть всё на место. И для этого приспособили неиспользуемую функцию mlock, которая досталась винде в наследство с первых версий, когда винды, чтобы получить сертификат соответствия, должны были соблюдать POSIX. Поэтому в man mlock можно не смотреть, что там написано. Это написано в 1980-х годах.
    Мне стало интересно, а есть ли какие-то нативные механизмы, чтобы самому организовать своп для своей программы. Ведь физической памяти может просто не хватить под все нужные данные.
    Так я узнал про механизм memory-mapped files. Который, как оказалось, настолько нативен, что работает в виндах очень быстро. Я стал придумывать, как разработать собственный менеджер памяти с поддержкой свопа и прочими плюшками, чтобы программа была ого-го, но тут грянул кризис, и всем стало не до этого.
  • Как реализовать кастомный тип данных в c++ без использования нативной системой типов?

    @vanyamba-electronics
    jcmvbkbc, я работал в 1998-м году в одной компании, и сопровождал программу, написанную до меня. Смотрю, какой-то mlock зачем-то. Не помню уже, что там вызывало проблему, но я решил проверить.
    Почитал man mlock.
    Этот парень что, пытается у мудрой виндовс памяти физически отнимать? - удивился я. - Зачем это вообще?
    Убрал в одном месте, ради теста.
    Программа стала очень быстро запускаться.
    О, какая красота, - порадовался я, и она тут уже упала с нарушением сегментации памяти.
    Я стал разбираться. Что за бред, почему падает?
    Запустил под отладчиком. Под отладчиком она даже не запустилась - сразу сегментация.
    Почему не работает? Что случилось? - я потратил на это полдня, пытаясь разобраться, почему компьютер стал вести себя как сумасшедший. Хотел даже винду переставлять.
    Но после обеда вдруг вспомнил - mlock, я же закомментировал mlock. Неужели проблема в этом?
    Раскомментировал обратно - всё заработало как раньше.
    В общем, проблема была не в mlock, и я потом три дня искал, в чём же ошибка.
    И вот, прошёл 21 год. Я пишу программу. Переписываю. Пишу, переписываю. Четвёртая версия, всё работает.
    Стал переделывать кое-что, две недели переделывал. Переделал - всё работает, только вдруг начала падать в давно отлаженном месте. Как будто this в объекте теряет своё значение.
    Что за бред? Комп ведёт себя, как сумасшедший. Отладчик lldb - тот ещё отладчик, много не наотладишь.
    Добавил в конструктор объектов сообщение, что объект создаётся, и что объект создан.
    Получил такую картину - в некоторых конструкторах вызываются конструкторы других объектов.
    Не может же быть причина в этом, - говорю я себе, но память подсказывает: как-то я писал программу на Delphi, и написать-то я её написал, но только работать она не стала, пришлось полностью перелопатить код, добавив во все объекты функцию create(), в которую пришлось поместить инициализацию. А всё потому, что в конструкторе не работают виртуальные методы.
    Ладно, ОК, напишем пятую версию. В XCode, с отладчиком нормальным.
    Пишу, пишу, всё прекрасно. Где-то на 10-м по счёту классе вдруг снова бред начинается, new снова стал вызывать исключение bad access в функции malloc.
    И вдруг я вспоминаю - есть функция, которая блокирует объект в памяти. memlock или что-то вроде того.
    Нашёл, добавил, всё заработало.
    Я должен заметить, что я потом работал в другой компании, и там мы писали прогу на MSVC, всю из COM-объектов. Там мы с этой проблемой не сталкивались, никаких mlock-ов. И всё работало. Видимо там какой-то другой менеджер памяти используется.
  • Как реализовать кастомный тип данных в c++ без использования нативной системой типов?

    @vanyamba-electronics
    jcmvbkbc, ошибка в этой строке:
    debug("Get item " + Token::uitohex(hkey) + " dict='" + m_msg_name + "' m_top=" + Token::itoa(m_top));

    Создание новой строки std::string вызывает new, который вызывает malloc, который и сообщает, что у объекта не совпадает контрольная сумма, что бывает, если указатель освобождён, а освобождённый объект после этого кто-то изменил.
    Если закомментировать эту строку, то ошибка просто выскочит при следующем вызове malloc.
    Мне на самом деле интересно, как правильно работать с памятью без mlock. С mlock всё работает.
    И самое главное - этот код прекрасно работал, пока экзешник не достиг определённого размера.
  • Как правильно пользоваться разделителем кода для Windows и linux?

    @vanyamba-electronics
    Vitaly, единый код означает, что у приложения будет один экземпляр кода. Если вы выпустили обновление, то вам не нужно будет собирать и тестировать приложение под разные версии операционных систем. Если что-то правильно работает у вас, то оно правильно работает везде, у всех пользователей.
  • Как реализовать кастомный тип данных в c++ без использования нативной системой типов?

    @vanyamba-electronics
    jcmvbkbc, хочу услышать совет по отладке:
    Process 1211 launched: '/Users/andrey/Documents/Eclipse/Workspace/fpli_0.4.bad/Debug/fpli' (x86_64)
    Creating stack & storage
    Stack & storage created
    Creating function: 0x0c1e7e96 '.'
    Function created: 0x0c1e7e96 '.' index=1
    Creating function: 0x155ed7d5 'dump'
    Function created: 0x155ed7d5 'dump' index=2
    Creating function: 0x11455d5e 'at'
    Function created: 0x11455d5e 'at' index=3
    Creating function: 0x20bc0470 'for_each_back'
    Function created: 0x20bc0470 'for_each_back' index=4
    Creating function: 0x1728a217 'for_each'
    Function created: 0x1728a217 'for_each' index=5
    Creating function: 0x10507577 'swap'
    Function created: 0x10507577 'swap' index=6
    Creating function: 0x105d4847 'drop'
    Function created: 0x105d4847 'drop' index=7
    Creating function: 0x105fa8a7 'over'
    Function created: 0x105fa8a7 'over' index=8
    fpli(1211,0x1004fe5c0) malloc: Incorrect checksum for freed object 0x100604788: probably modified after being freed.
    Corrupt value: 0x30000100603b4
    fpli(1211,0x1004fe5c0) malloc: *** set a breakpoint in malloc_error_break to debug
    Process 1211 stopped
    * thread #1, queue = 'com.apple.main-thread', stop reason = signal SIGABRT
        frame #0: 0x00007fff6e9732c6 libsystem_kernel.dylib`__pthread_kill + 10
    libsystem_kernel.dylib`__pthread_kill:
    ->  0x7fff6e9732c6 <+10>: jae    0x7fff6e9732d0            ; <+20>
        0x7fff6e9732c8 <+12>: movq   %rax, %rdi
        0x7fff6e9732cb <+15>: jmp    0x7fff6e96d457            ; cerror_nocancel
        0x7fff6e9732d0 <+20>: retq   
    Target 0: (fpli) stopped.
    (lldb) bt
    error: fpli debug map object file '/Users/andrey/Documents/Eclipse/Workspace/fpli/Debug/source/fpli.o' has changed (actual time is 2019-07-27 00:24:56.000000000, debug map time is 2019-07-25 23:18:41.000000000) since this executable was linked, file will be ignored
    * thread #1, queue = 'com.apple.main-thread', stop reason = signal SIGABRT
      * frame #0: 0x00007fff6e9732c6 libsystem_kernel.dylib`__pthread_kill + 10
        frame #1: 0x00007fff6ea2ebf1 libsystem_pthread.dylib`pthread_kill + 284
        frame #2: 0x00007fff6e8dd6a6 libsystem_c.dylib`abort + 127
        frame #3: 0x00007fff6e9ec077 libsystem_malloc.dylib`malloc_vreport + 545
        frame #4: 0x00007fff6ea04e0d libsystem_malloc.dylib`malloc_zone_error + 183
        frame #5: 0x00007fff6e9e4f17 libsystem_malloc.dylib`tiny_malloc_from_free_list + 1310
        frame #6: 0x00007fff6e9e443b libsystem_malloc.dylib`tiny_malloc_should_clear + 314
        frame #7: 0x00007fff6e9e420f libsystem_malloc.dylib`szone_malloc_should_clear + 66
        frame #8: 0x00007fff6e9e2c99 libsystem_malloc.dylib`malloc_zone_malloc + 103
        frame #9: 0x00007fff6e9e2c15 libsystem_malloc.dylib`malloc + 24
        frame #10: 0x00007fff6bab7378 libc++abi.dylib`operator new(unsigned long) + 40
        frame #11: 0x00007fff6ba6de20 libc++.1.dylib`std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__init(char const*, unsigned long, unsigned long) + 66
        frame #12: 0x0000000100135700 fpli`std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > std::__1::operator+<char, std::__1::char_traits<char>, std::__1::allocator<char> >(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, char const*) + 128
        frame #13: 0x00000001001359f6 fpli`Dictionary::dict_get_item(unsigned int) + 150
        frame #14: 0x0000000100138efe fpli`FunctionDictionary::get_function(unsigned int) + 30
        frame #15: 0x00000001000a2b93 fpli`IFunction* find_function<RefOverFunction>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) + 291
        frame #16: 0x00000001000a0eb7 fpli`StackType::StackType() + 1079
        frame #17: 0x00000001000a5405 fpli`StackType::StackType() + 21
        frame #18: 0x000000010013d171 fpli`TypeDictionary::create_types() + 225
        frame #19: 0x000000010018986a fpli`main + 650
        frame #20: 0x00007fff6e8383d5 libdyld.dylib`start + 1
        frame #21: 0x00007fff6e8383d5 libdyld.dylib`start + 1
  • Как реализовать кастомный тип данных в c++ без использования нативной системой типов?

    @vanyamba-electronics
    jcmvbkbc, я не стану на эту тему спорить. Если бы malloc работал без mlock, то это было бы прекрасно. Проблема в том, что он работает. Но только до определённого момента.
    Например, в g++ я словил проблемы с памятью, когда программа разрослась больше, чем на 2 мегабайта (в коде). Давно забыл про этот вопрос, и долго не мог понять, где ошибка.
    Решил переписать всё с нуля, в XCode, поскольку там есть отладчик. Как только экзешник стал больше 2 мегабайт, полезли отличные ошибки. Я выделяю память, а указатель невалиден, пишет "возможно объект был изменён после удаления". Какое удаление? Вот он, объект, только что создан.
    И тут я вспоминаю про функцию mlock(), с которой уже имел такие грабли лет почти 25 назад. Добавил - работает.
  • Как реализовать кастомный тип данных в c++ без использования нативной системой типов?

    @vanyamba-electronics
    jcmvbkbc, во-первых, источник - int, его размер sizeof(int), проверку нужно добавить, это да. И да, можно было использовать memcpy.
    Во-вторых, выделять память в конструкторе - плохая идея, это нужно делать в функции create(), но я не стал усложнять код примера.
    В-третьих, mlock() гарантирует, что выделенная память не будет спейджирована операционной системой, и указатель будет валидным во время выполнения программы.
  • Как добавить тесты к проекту CMake в Visual Studio?

    @vanyamba-electronics
    Можно просто создать отдельный проект для тестов.
  • Как правильно подключать файлы .h C++?

    @vanyamba-electronics
    Zakhar Delov, включите в настройках вывод сообщений компилятора, а то так непонятно, в чём именно ошибка.
  • T - это массив из 3 указателей на структуры с типом car?

    @vanyamba-electronics
    lorc, ещё и не всякий компилятор без struct примет
  • Блок питания 100 V DC из последовательных ноутбучных БП -- возможно?

    @vanyamba-electronics
    zv347, а их и не выпускают. Напряжение ведь не стандартное. Откуда оно вообще взялось - 100 Вольт постоянного тока? Что собираетесь питать?
  • Порекомендуете книги по С++ для самых новичков?

    @vanyamba-electronics
    KodeR0, Страуструп написал компилятор C++, чтобы воплотить идеи Гради Буча и Эндрю Мура на базе языка C. Просто поверьте моему опыту - после Delphi совершенно непонятно, почему в C++ то сделано эдак, а это так, пока не прочитаете у Гради Буча как вообще надо проектировать приложения в ООП.
  • Порекомендуете книги по С++ для самых новичков?

    @vanyamba-electronics
    Сергей Горностаев, Страуструпа будет довольно сложно понять без Гради Буча