- 博客(284)
- 资源 (7)
- 问答 (1)
- 收藏
- 关注
原创 记录STM32的GPIO 的坑 复用引脚PB3 PB4
如果需要将PB4用作普通的GPIO,需要通过重映射配置来关闭JTAG功能,使其可以作为普通IO口使用。请注意,这段代码应该在任何可能依赖于这些引脚配置的外设初始化之前执行。如果你在程序的后面或者不确定的位置使用这段代码,可能会导致外设初始化失败或者引脚行为异常。因此,建议在程序的最前面,确保所有必要的初始化都已完成。:如果你使用的是STM32 HAL库,这段代码应该放在HAL库初始化之后,因为HAL库的初始化可能会依赖于AFIO的配置。:在配置任何依赖于这些引脚的外设之前,确保引脚映射已经被设置。
2024-11-04 10:26:21 1009
原创 C++ 4.编程风格-copy and swap
总的来说,Copy and Swap 技术在多线程环境中是安全的,只要涉及到的资源交换是线程安全的或者在同步的上下文中进行。总的来说,在多线程环境中,Copy and Swap技术本身是安全的,但是需要确保涉及到的资源交换操作是线程安全的。这个过程是线程安全的,因为它不涉及共享数据,每个线程都有自己的临时对象副本。例如,如果一个类的对象被多个线程共享,并且你需要使用 Copy and Swap 技术来实现线程安全的赋值操作,那么你可能需要使用互斥锁来保护 swap 操作,以防止同时的访问导致数据竞争。
2024-11-03 06:00:00 562
原创 C++ 5.编程风格-pImpl (指针指向具体实现)
pImpl 模式是一种有效的技术,用于分离接口和实现,提高代码的模块化和可维护性。它特别适用于大型项目和需要频繁更新实现的库。通过使用 pImpl,可以减少编译依赖,提高编译速度,并保护实现细节不被外部访问。
2024-11-03 06:00:00 2012
原创 C++ 2.编程风格-枚举类替换命名空间 enum class
使用enum关键字定义枚举类型,可以指定底层的整数类型(如int、unsigned int等),如果不指定,默认为`int。
2024-11-02 06:00:00 770
原创 C++11 1.编程风格-初始化列表 initializer list
在 C++11 及更高版本中,使用初始化列表来初始化自定义类是一种推荐的做法,特别是对于类中包含常量成员或者需要高效初始化的场景。初始化列表确保成员变量按照声明的顺序进行初始化,并且可以在构造函数体内直接初始化成员变量。首先,定义你的类,并在构造函数中使用初始化列表来初始化成员变量。// 构造函数使用初始化列表return 0;
2024-11-01 06:00:00 1255
原创 C++ 创建线程的五种类型
点击直达——文章总目录在 C++ 中,创建线程可以通过多种方式实现,每种方式有其特定的用途和特点。以下是五种常见的创建线程的方法:这是 C++11 引入的最直观的线程创建方式,允许你直接在 C++ 代码中创建和管理线程。示例代码:1.2. 使用 是基于 的一个封装,它不仅创建了一个线程,还返回一个 对象,可以用来获取异步操作的结果。示例代码:1.3. 使用 POSIX 线程()这是在 UNIX-like 系统中使用的标准线程库。虽然 C++11 提供了 ,但在某些情况下,你可能仍然需要使用 P
2024-10-31 07:00:00 704
原创 C++ Join 与 Detachs
点击直达——文章总目录在 C++ 的多线程编程中, 和 是 类的两个成员函数,它们用于管理线程的生命周期和执行方式。示例代码:1.2.作用:让线程在后台独立运行。行为:当一个线程对象被 后,该线程将独立于主线程运行,主线程不需要等待它结束就可以继续执行。如果主线程结束, 后的线程将继续执行直到完成。使用场景:当你不需要等待线程结束或者需要线程在后台长时间运行时使用。注意事项:一旦线程被 ,就不能再对它进行 或 操作。必须确保 的线程在程序结束前完成执行,否则程序退出时可能会导致
2024-10-31 07:00:00 1114
原创 C++11 04-并发编程 Concurrent programming
在共享资源的同一作用域中定义一个std::mutex对象。定义一个互斥锁(std::mutex)和一个条件变量(),以及一个用于存储数据的队列。生产者函数将数据放入队列,并通知消费者数据已准备好。i < 5;++i) {// 通知一个等待的消费者消费者函数从队列中获取数据进行处理。});// 等待直到队列不为空。
2024-10-30 07:00:00 1208
原创 C++11 35-tuple
点击直达——文章总目录在 C++11 中, 是一个非常灵活的模板类,它允许你将多个值组合成一个单一的对象。这在函数需要返回多个值或者你需要将多个相关数据项组合在一起时非常有用。 支持各种操作,包括访问、赋值和比较等。你可以通过直接初始化或使用 函数来创建 对象。例如:1.2.访问 中的元素你可以使用 函数按索引访问 中的元素:1.3.使用 进行结构化绑定你还可以使用 来创建一个 的引用,这样可以将 中的元素分别绑定到不同的变量上:1.4. 的哈希函数如果你想在哈希表中使用 作
2024-10-29 07:00:00 709
原创 C++14 1-二进制字面量 Binary literal
在 C++14 标准中,引入了二进制字面量(binary literals),允许开发者使用更直观的方式表示二进制数。这个特性在 C++11 中并不存在,但经常被误认为是 C++11 的一部分。来表示一个数字是二进制的,后面跟着一个或多个二进制数字(0 或 1)。这种表示法在处理二进制数据时非常有用,因为它提供了一种更清晰、更易于阅读的方式来表示二进制数。这种新的字面量表示法在编写涉及二进制操作的代码时非常有用,比如在硬件编程、底层系统开发或任何需要直接操作位的场景中。二进制字面量使用前缀。
2024-10-29 07:00:00 329
原创 C++11 33-move aware class
移动构造函数接受一个右值引用作为参数,用于从另一个同类型对象中“窃取”资源。public:// 构造函数// 移动构造函数// 将源对象的资源指针置空,避免双重释放// 析构函数private:int* data_;移动赋值运算符同样接受一个右值引用参数,并需要处理自赋值的情况。// 移动赋值运算符if (this!= &other) { // 检查自赋值// 释放现有资源// 窃取资源// 将源对象的资源指针置空。
2024-10-28 07:00:00 771
原创 C++11 34-Hash Function
为自定义类型编写一个合适的哈希函数,以确保哈希表的高效性,需要考虑几个关键因素:分布均匀性、快速计算、以及尽量减少哈希冲突。
2024-10-28 07:00:00 944
原创 C++11 31-nullptr and nullptr_t
nullptr是一个空指针字面量,表示一个不指向任何对象的指针值。是nullptr的类型。nullptr可以被转换为任何指针类型,也可以转换为布尔类型(在布尔上下文中为false),但不能转换为整数类型。通过使用nullptr和,C++11 提供了一种更安全和表达性更强的方式来处理空指针。
2024-10-27 07:00:00 612
原创 C++11 32-type alias
在模板元编程中,类型别名(Type Aliases)和类型推导(Type Deduction)都是用来简化复杂类型表达式的工具,但它们的用途和工作方式有所不同。类型别名在优化模板函数重载中非常有用,因为它们可以简化复杂的类型表达式,使得重载的模板函数更加清晰和易于管理。类型别名在模板元编程中非常有用,因为它们可以简化复杂的类型表达式,增加代码的可读性和可维护性。类型别名可以用于基础类型、模板、类、函数指针等。使用类型别名可以为复杂的模板参数列表创建一个简短的名称,这样可以减少模板定义中的冗长类型表达式。
2024-10-27 07:00:00 750
原创 C++11 29-外部模板 Extern Template
内部模板和外部模板的主要区别在于它们如何被实例化和管理。内部模板提供了灵活性但可能导致编译效率问题,而外部模板有助于优化编译过程,特别是在大型项目中。正确使用外部模板可以显著提高编译效率和减少二进制大小。首先,将模板类或函数的定义放在一个头文件中,并确保不在头文件中进行任何模板的显式实例化。
2024-10-26 07:00:00 968
原创 C++11 30-可变参数模板 Variadic Templates
可变参数模板可以用于创建类型安全的函数封装器,这些封装器可以接受任意数量和类型的参数,并将其转发给另一个函数。在 C++11 之前的版本中,如果需要处理不同数量的参数,你需要为每种情况编写不同的模板。在泛型编程中,可变参数模板允许开发者编写可以接受任意数量参数的函数或类模板。使用可变参数模板实现一个函数,使其能够处理任意数量和类型的参数,可以通过递归模板展开和折叠表达式来完成。可变参数模板可以用于创建函数包装器,这些包装器可以接受任意数量的参数,并将它们转发给另一个函数,这在实现高阶函数时非常有用。
2024-10-26 07:00:00 969
原创 C++11 28-纯虚函数的默认实现 The default implementation of pure virtual functions
C++11 28-纯虚函数的默认实现 The default implementation of pure virtual functions
2024-10-25 08:11:36 791
原创 C++11 27-显式的虚拟函数重写 Explicit rewriting of virtual functions
使用final关键字是一种明确和有效的方法来防止派生类重写特定的虚函数,有助于提高代码的安全性和可维护性。
2024-10-25 08:10:55 735
原创 【人生哲学】弱水三千,只取一瓢
它最初并不是用来描述爱情的,而是源自佛经中的一则故事,用来提醒人们不要迷失在繁华的世界中,世界上有很多吸引人的东西,但人应该专注于一件,用心去对待这一件就足够了。它提醒我们在人生的旅途中,要有明确的目标和坚定的信念,不被外界所迷惑,只专注于那些真正对我们有意义和价值的事情。同时,这个决定也应该是双方共同的,确保你们都对未来有共同的愿景和承诺。此外,“弱水三千,只取一瓢”也可以引申到生活的许多层面,比如对事业的选择,意味着在众多可能的选择中,人们应该选择自己最喜欢、最擅长的领域,切忌贪多嚼不烂。
2024-10-24 21:24:13 84
原创 C++11 26-多成员的 `using` 声明 Multi member using declaration
在 C++11 中,using声明可以被用来定义模板别名,这是一种为模板创建简短名称的方法。这在处理复杂的模板类型时非常有用,因为它可以使得代码更加简洁和可读。假设我们有一个基类模板,它定义了一个与模板参数相关的类型别名,我们希望在派生类中引入这个类型别名。// 基类模板public:// 类型别名// 派生类模板public:// 使用 using 声明显式地从基类引入类型别名// 输出 42return 0;在这个例子中,Derived类模板使用来显式地从Base。
2024-10-24 07:00:00 1542
原创 C++11 22-新的转换运算符 New conversion operator
点击直达——文章总目录C++11引入了新的类型转换运算符,主要包括以下几种::用于基本的非多态类型转换,包括将派生类指针转换为基类指针(上转型)和非多态类型的转换。它不进行运行时类型检查。:用于修改值的或属性。它不改变表达式的值类型。:用于进行低层次的重新解释转换,比如将指针类型转换为整数类型,或者反过来。这种转换不安全,因为它不检查转换的合理性。:用于类层次结构中的向下转型(将基类指针或引用转换为派生类指针或引用),它在运行时进行类型检查,如果转换失败会返回或抛出异常。C++11还引入了显示的类型转换运算
2024-10-23 07:00:00 1574
原创 C++11 23-头文件中的 inline 变量 Inline variable in header file
inline头文件保护(Include Guards)通过宏定义来确保头文件只被包含一次,防止重复定义。// 头文件内容这是非标准的预处理指令,但被大多数编译器支持,用于防止头文件被重复包含。// example.h # pragma once // 头文件内容constexpr变量用于定义编译时常量,可以在多个编译单元中使用而不会重复定义。外部链接(extern使用extern关键字声明全局变量,然后在一个源文件中定义变量。匿名命名空间。
2024-10-23 07:00:00 836
原创 【人生哲学】4年程序员的碎碎念
以下是一个4年程序员的碎碎念,如有冒犯,请多多包涵。一年又一年,视力变差了,勉强吃饱饭,来把双休休。“人生能有几回搏”。4年时间,经历了考研fail,创业fail以及不为人知的fail。我的心如止水,毫无波澜。也不知什么时候,让我养成了“泰山崩于前而色不变,麋鹿兴于左而目不瞬”的心态,或是这就是成年人的世界,哈哈^-^97年至今,算作一个老男孩了吧,所以我开了个叫的开源库,感觉是不是像是有点闷骚男的感觉,不过不用怕,只要知道的人少,世界那么大,没人知道的。
2024-10-22 13:38:55 355
原创 C++11 20-扩展的 `sizeof` Extended sizeof
点击直达——文章总目录在 C++11 之前, 运算符主要用于获取变量或类型在内存中所占的字节数。C++11 扩展了 的用法,允许在编译时对表达式进行操作,增加了它的灵活性和表达能力。以下是 C++11 扩展的 用法:对表达式使用 :C++11 允许你在 中使用表达式,而不仅仅是类型或变量。编译器会计算该表达式的返回类型所占用的字节数。对函数返回类型使用 :可以对函数的返回类型使用 ,编译器会计算返回值类型所占用的字节数。对成员函数使用 :可以对类的成员函数使用 ,编译器会计算成员函数
2024-10-22 07:00:00 638
原创 C++11 21-统一的内存模型 Unified memory model
内存顺序是确保多线程程序正确性和性能的关键。通过合理选择内存顺序,可以在保持程序性能的同时,避免并发问题。
2024-10-22 07:00:00 851
原创 C++11 18-用户定义的字面量 User defined literal values
C++11 引入了用户定义的字面量(User-Defined Literals, UDLs),这是一种允许开发者为字面量(如字符串、数字等)定义自定义的后缀,从而实现自定义操作的机制。UDLs 使得开发者能够扩展字面量的语义,提供更丰富的表达能力和灵活性。C++11 中引入的用户定义字面量(User-Defined Literals,UDLs)为语言增加了极大的灵活性。UDLs 允许开发者为字面量定义自定义的后缀,从而实现特定的操作。单位系统。
2024-10-21 07:00:00 639
原创 C++11 19-线程局部存储 Thread Local Storage
首先,定义一个单例类,并在类内使用存储实例指针。private:// 确保不会复制和移动public:// 获取当前线程的单例实例// 初始化静态成员变量。
2024-10-21 07:00:00 1027
原创 C++11 17-文件系统库 File System Library
总的来说,如果你的项目已经在使用 Boost,并且不需要迁移到 C++17,那么继续使用 Boost.Filesystem 是合理的。如果你使用的是支持 C++17 的编译器,并且希望减少对外部库的依赖,那么迁移到 std::filesystem 是一个不错的选择。:在某些系统上,文件系统操作可能受到权限限制,尤其是在 UNIX-like 系统中,这可能会影响文件的创建、删除和修改。:在C++11标准中,有一个技术报告2(TR2),其中包含了文件系统库的早期版本,可以在一些编译器中使用。
2024-10-20 07:00:00 781
原创 C++11 14-属性语法 attribute syntax
点击直达——文章总目录在C++11中,引入了属性(Attributes)的概念,这是一种用于修饰函数、变量、类等实体的机制,允许编译器和链接器识别特定的元数据。属性通常用于提供编译器特定的指令或优化,但它们不是C++标准的一部分,因此它们的支持和语法可能会因编译器而异。以下是一些常见的C++11属性及其用法:[[noreturn]]:指示函数不会返回。[[deprecated]]:标记函数、变量或类型为已弃用。[[nodiscard]]:提示调用者使用函数返回值。[[maybe_unuse
2024-10-19 07:00:00 651
原创 C++11 15-原子操作 Atomic operation
选择适当的内存顺序可以减少同步的开销,同时保证操作的原子性和可见性。使用原子操作时,应该仔细考虑你的并发需求,并根据实际情况选择合适的原子类型和操作。:在无锁编程中,ABA问题是一个常见问题,其中一个线程读取一个值,然后在它更新之前,该值被另一个线程改变,然后又被改回原来的值。:原子操作确保在多线程环境中对共享变量的访问是原子的,这意味着在任何时刻只有一个线程可以访问该变量,从而避免数据竞争。:在多线程程序中,当需要更新一个共享变量时,可以使用原子操作来确保更新操作的原子性,避免数据不一致的问题。
2024-10-19 07:00:00 1106
原创 C++11 12-类型萃取 Type extraction
我们将创建一个模板函数,它使用类型特征来确定如何排序数据。// 使用类型特征来判断容器中的数据类型// 如果容器中的数据类型是算术类型,使用标准库的 sort 函数} else {// 对于非算术类型,使用自定义的排序规则});我们将创建一个模板函数,它使用类型特征来确定容器中的数据类型,并选择合适的搜索方法。// 使用类型特征来判断容器中的数据类型// 如果容器支持随机访问,使用二分查找} else {// 如果容器不支持随机访问,使用线性搜索。
2024-10-18 07:00:00 1199
MobaXterm.7z
2021-05-04
ros_21_tutorials-master.zip
2020-07-11
wesigj-ROS-Academy-for-Beginners-melodic.zip
2020-07-11
Ubuntu18.04 melodic 本机的API服务器如何订阅ROS的话题数据
2021-04-20
TA创建的收藏夹 TA关注的收藏夹
TA关注的人