记录关于 LLVM C/C++ 适用 libc++ 的一些注意事项

可以看看这个:

https://releases.llvm.org/12.0.1/projects/libcxx/docs/UsingLibcxx.html

1、std::function 在 libc++ 之中不是线程安全的,在GCC/VC上面可以多线程上操作,在LLVM提供的LIBC++标准库之中不行,要牢记,写程序要考虑多个库的兼容性。

     std::move 这类操作需要同步处理,好的建议方案是实例化并放到共享指针、或者唯一指针包一层来管理,传递最好用共享指针来处理。

好的建议是自己重写 std::function 支持线程安全,用CAS自选来保证同步就行了,因为这个复制很快,当然如果你是大复制那就比较慢了,建议就复制指针就可以了,自己加上引用技术管理,减少复制次数,或者省事内部实现用共享指针来代替,复制只需要拷贝共享过去就行,就只是涉及到堆weak_ptr的引用技术增加的问题。

2、全局变量不可以初始化涉及到 new/delete 内存分配的,因为这个时候 libc++ 标准库堆还没有准备好。

3、跟第二条差不多,static不可以初始化boost::asio::io_context、std::string、std::map 这一类的容器。

但是static上面初始化仅基础数据组成的结构是没问题的,比如int数组、struct 不带STL相关的东西也可以。

共享指针可以弄,但是不要初始化有值,只是shared_ptr、weak_ptr、之类的不会出现仍和问题,初始化要放到 main 函数被调用里面去。

所以一个好的习惯是写统一的 cctor(静态构造函数)在main函数进入的时候,自己调用一下,另外如果你在static上面初始化本来就不是什么好习惯,因为你不能控制编译器调用的初始化顺序,如果有依赖就会麻瓜。

其它的跟GCC、VC++标准库的差不多,不需要特别注意,但是BOOST有些初始化是不兼容LIBC++的,这种遇到自己改BOOST库,或者不用这部分库的代码引入,自己重新写,自己评估,反正程序一启动就崩溃。

自己用 GDB、OD/WINDBG之类的打 _start BP点然后调汇编自个慢慢看,就晓得哪里有问题了,但是按照上面的注意风险,遇到这种问题的概率不多。

如果连基本的一些汇编程序都看不懂,建议你好好学习下,毕竟C/C++需要耐得住,各种莫名其妙的BUG,跟你的代码可能就没任何关系,重新编译下,立马好使问题全部解决,当然这个前提是你要能判断出是不是编译的问题。

当然如果您实在滴不行,觉得面向地址标识符编程太痛苦,真的、真的,MMP的太难受,C/C++ 开发可能不太适合您,毕竟这是基本功,GO之类更高级跟计算机隔离的编程语言会是个很好的选择,您不需要折腾,不需要学习那么多系统化的知识,简单有粗暴,开发有效率,人身有自由,多好。

你可能感兴趣的:(C/C++,c语言,c++,开发语言)