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

可以看看这个:

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

1、std::function<void()> 在 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之类更高级跟计算机隔离的编程语言会是个很好的选择,您不需要折腾,不需要学习那么多系统化的知识,简单有粗暴,开发有效率,人身有自由,多好。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/671645.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DevExpress WinForms中文教程 - 如何创建可访问的WinForms应用?(二)

为用户创建易访问的Windows Forms应用程序不仅是最佳实践的体现&#xff0c;还是对包容性和以用户为中心的设计承诺。在应用程序开发生命周期的早期考虑与可访问性相关的需求可以节省长期运行的时间(因为它将决定设计决策和代码实现)。 一个可访问的WinForms应用程序提供了各种…

UC++常用语句示例

Actor操作 移动 FVector CurrentLocation GetActorLocation(); // 在X轴上增加移动 CurrentLocation.X MoveSpeed * DeltaTime; // 应用新的位置 SetActorLocation(CurrentLocation); AddActorLocalOffset(FVector(MoveSpeed * DeltaTime, 0.0f, 0.0f)); // 获取当前相对位…

mysql清空表数据后如何让自增ID仍从1开始

有2种方法&#xff1a; 1、清空表时使用truncate命令&#xff0c;而不用delete命令 truncate test; 使用truncate命令的好处&#xff1a; 1&#xff09;、速度快 2&#xff09;、可以对自增ID进行重排&#xff0c;使自增ID仍从1开始计算 2、清空表数据后&#xff0c;使用alter…

Android 11 访问 Android/data/或者getExternalCacheDir() root方式

前言&#xff1a; 需求要求安装三方应用ExternalCacheDir()下载下来的apk文件。 getExternalCacheDir() : /storage/emulated/0/Android/data/com../cache/ 获取访问权限 如果手机安卓版本为Android10的时候,可以在AndroidManifest.xml中添加下列代码 android:requestLegacyExt…

20240202在Ubuntu20.04.6下使用whisper.cpp的显卡模式

20240202在Ubuntu20.04.6下使用whisper.cpp的显卡模式 2024/2/2 19:43 【结论&#xff1a;在Ubuntu20.04.6下&#xff0c;确认large模式识别7分钟中文视频&#xff0c;需要356447.78 ms&#xff0c;也就是356.5秒&#xff0c;需要大概5分钟&#xff01;效率太差&#xff01;】 …

CleanMyMac2024如何识别并清理垃圾文件?

CleanMyMac识别并清理垃圾文件的过程主要依赖于其强大的扫描功能和智能算法。以下是具体的步骤&#xff1a; 扫描垃圾文件&#xff1a;首先&#xff0c;用户需要打开CleanMyMac软件&#xff0c;并点击“智能扫描”功能。然后&#xff0c;软件将开始自动扫描Mac系统上的各种垃圾…

微信小程序(基本操作)

概念&#xff1a; 小程序&#xff1a;就是小程序&#xff0c;mini program。现在市面上有微信小程序&#xff0c;百度智能小程序等等。 微信小程序&#xff0c;简称小程序&#xff0c;英文名Mini Program&#xff0c;是一种不需要下载安装即可使用的应用&#xff0c;它实现了…

课时16:本地变量_普通变量

2.2.2 普通变量 学习目标 这一节&#xff0c;我们从 基础知识、简单实践、小结 三个方面来学习。 基础知识 变量分类 所谓的本地变量就是&#xff1a;在当前系统的某个环境下才能生效的变量&#xff0c;作用范围小。本地变量按照变量值的生成方式包含两种&#xff1a;普通…

5-4、S加减单片机程序【51单片机+L298N步进电机系列教程】

↑↑↑点击上方【目录】&#xff0c;查看本系列全部文章 摘要&#xff1a;本节介绍实现步进电机S曲线运动的代码 一、目标功能 实现步进电机转动总角度720&#xff0c;其中加减速各90 加速段&#xff1a;加速类型&#xff1a;S曲线  加速角度&#xff1a;角度为90  起步速度…

CSS太极动态图

CSS太极动态图 1. 案例效果 我们今天学习用HTML和CSS实现动态的太极&#xff0c;看一下效果。 2. 分析思路 太极图是由两个旋转的圆组成&#xff0c;一个是黑圆&#xff0c;一个是白圆。实现现原理是使用CSS的动画和渐变背景属性。 首先&#xff0c;为所有元素设置默认值为0…

Topaz Photo AI for Mac v2.3.1 补丁版人工智能降噪软件无损放大

想要将模糊的图片变得更加清晰&#xff1f;不妨试试Topaz Photo AI for Mac 这款人工智能、无损放大软件。Topaz Photo AI for Mac 一款强大的人工智能降噪软件&#xff0c;允许用户使用复杂的锐化算法来提高图像清晰度&#xff0c;还包括肖像编辑选项&#xff0c;如面部重塑、…

Visual Studio 2010+C#实现信源和信息熵

1. 设计要求 以图形界面的方式设计一套程序&#xff0c;该程序可以实现以下功能&#xff1a; 从输入框输入单个或多个概率&#xff0c;然后使用者可以通过相关按钮的点击求解相应的对数&#xff0c;自信息以及信息熵程序要能够实现马尔可夫信源转移概率矩阵的输入并且可以计算…

Python系列(10)—— 逻辑运算符

在Python中&#xff0c;逻辑运算符被用于连接布尔表达式&#xff0c;从而根据这些表达式的真假值来执行相应的操作。Python提供了三种基本的逻辑运算符&#xff1a;and&#xff08;与&#xff09;、or&#xff08;或&#xff09;和not&#xff08;非&#xff09;。 1. and 运算…

几千年的人类很难弄清楚一百多亿年宇宙的秘密

人类探索宇宙的历程充满了挑战和困难。宇宙之广阔、之复杂远超人类直观理解的范畴。从地球上抬头仰望星空到现代天文学和物理学的深入研究&#xff0c;人类对宇宙的认识经历了漫长且艰难的过程。以下是几个方面来说明为什么人类很难弄清楚宇宙的秘密&#xff1a; 1、宇宙的规模…

Netty源码系列 之 EventLoop run()方法 源码

EventLoop[实现类为NioEventLoop&#xff0c;我们研究NioEventLoop即可] EventLoop是一个单线程的线程池 核心作用&#xff1a;处理执行IO操作&#xff08;accept&#xff0c;read&#xff0c;write事件&#xff09;&#xff0c;普通任务&#xff0c;定时任务 EventLoop封装…

将因子转换为数字

在 R 中使用 as.numeric 函数将因子转换为数字 as 函数通常用于将数据类型显式转换为另一种类型。转换过程在 R 术语中称为强制转换&#xff0c;它表示其他编程语言中存在的强制转换概念。当我们调用函数 as.logical 时&#xff0c;它会尝试将传递的参数强制转换为逻辑类型。类…

精酿啤酒:发酵过程中的温度控制与效果

在啤酒酿造过程中&#xff0c;发酵温度的控制重要&#xff0c;它不仅影响酵母菌的活性&#xff0c;还决定了啤酒的口感、香气和风味。对于Fendi Club啤酒来说&#xff0c;切确控制发酵温度是确保啤酒品质和口感的关键环节。 在Fendi Club啤酒的发酵过程中&#xff0c;温度控制尤…

c#cad 创建-正方形(四)

运行环境 vs2022 c# cad2016 调试成功 一、程序说明 创建一个正方形&#xff0c;并将其添加到当前活动文档的模型空间中。 程序首先获取当前活动文档和数据库&#xff0c;并创建一个编辑器对象。 然后&#xff0c;使用事务开始创建正方形的操作。获取模型空间的块表记录&a…

Vue3大事件项目(ing)

文章目录 核心内容1.大事件项目介绍2.大事件项目创建3.Eslint配置代码风格4.配置代码检查工作流问题: pnpm lint是全量检查,耗时问题,历史问题 5.目录调整6.vue-router4 路由代码解析7.引入 Element Plus 组件库8.Pinia 构建仓库 和 持久化9.Pinia 仓库统一管理 核心内容 Vue3…

C# 夺冠,微软.NET前途光明!

本文以C# 摘得 “2023 年度编程语言“称号为背景&#xff0c;介绍.NET的历史、生态及发展势头&#xff0c;该文章是本人C#专栏的第一篇文章。 这里写目录标题 1.C#摘得"2023年度编程语言"奖项2.什么是.NET&#xff1f;2.1.NET简史2.2.NET是用于应用程序开发的生态系…