Peter(阿斯拉达)
关注系统界面开发技术,安全,语言特性,网络,图形,AI,硬件,并发,研发流程管理.
展开
-
[C/C++11]_[初级]_[哈希Map的STL实现unordered_map简介]
1. `C++`有没有类似的`Java`的类`HashMap`,可以在数据量大的时候查询元素时间复杂度是常量时间的?原创 2025-03-02 14:12:26 · 75 阅读 · 0 评论 -
[C++11]_[初级]_[多线程条件变量wait_for方法的使用]
1. 在开发多线程程序时,有时候需要启动一个线程来监听外部进程的执行情况,并且在指定时间如果还没运行结束就强制结束外部线程。那么`C++`标准库有这种监听线程并能在超时时提示的方法吗?原创 2025-01-11 17:54:43 · 116 阅读 · 0 评论 -
[C/C++]_[初级]_[三元运算符的陷阱]
搞懂三元运算符的优先级,能避免运算陷阱。原创 2024-11-30 10:38:44 · 150 阅读 · 0 评论 -
[C/C++]_[初级]_[浅析std::remove函数的原理和用法]
1. 在开发程序的时候,经常需要移除在集合里符合条件的对象,`C++`有没有快捷的方法?2. 字符串里有空格,有没有库能快速删除的?原创 2024-08-04 19:37:46 · 398 阅读 · 0 评论 -
[C/C++]_[初级]_[在Windows和macOS平台上导出动态库的一些思考]
1. 最近看了`《COM本质论》`里关于如何设计基于抽象基类作为二进制接口,把编译器和链接器的实现隐藏在这个二进制接口中,从而使用该`DLL`时不需要重新编译。在编译出`C`接口时,发现接口名直接是函数名,比如`BindNativePort`,怎么不是`_BindNativePort`?原创 2024-05-31 17:23:47 · 480 阅读 · 0 评论 -
[C/C++11]_[中级]_[如何编写内存安全的C++代码]
1. `C/C++`不是内存安全,比如指针操作内存时最常见的就是缓存区溢出,数据越界,使用未初始化的内存等。那么借助现代的`C++`新版本新特性能避免吗?原创 2024-03-13 11:29:25 · 177 阅读 · 0 评论 -
[C/C++11]_[WTL/ATL]_[多线程如何无锁更新进度条界面上的描述字符串]
1. 开发界面程序`WTL/Win32`时,经常会使用进度条来实时显示百分比和描述文字。这些文字一般都用一个成员变量`wstring`来存储,而文字的更新可能比较频繁,比如下载复制文件时,显示正在复制的文件名。可能`500ms`就需要更新一次文字。 绘制是在主线程操作,那么更新和读取得常见做法是工作线程发送消息到需要更新的文本到主线程,之后主线程取出消息并更新文本。这么做的缺陷就是需要发送的消息太多了。有没有更好的办法?原创 2024-03-06 16:30:18 · 224 阅读 · 0 评论 -
[C/C++]_[中级]_[获取月份的最后一天]
1. `C/C++`的新版日期类型并不能获取日期的具体数值。`C++20`的`std::chrono::month_day_last`可以获取某月的最后一天,但是返回的类型是`month_day_last`类型,这个类型无法获取天数,只能获取月份。 所以`C/C++`如何获取某年月份的最后一天?原创 2022-12-04 11:32:44 · 1143 阅读 · 0 评论 -
[C/C++11]_[中级]_[使用future来获取异步调用返回值和解决回调地狱问题]
场景在异步编程时, 往往需要传入函数A作为接收异步调用的输出。 因为当异步逻辑得到数据时,就会调用函数A,我们称函数A为回调函数。在回调函数A里写的逻辑被调用时,如果需要以此结果作为另一个异步调用的参数,那么通常的做法就是在回调函数A里调用异步逻辑,传入回调函数B。以此类推,如果回调函数里不得不调用另一个回调函数,那么就会出现我们常说的回调地狱(Callback Hell). 如何解决?说明在C++11之后可以通过传入lambda表达式来代替普通函数指针,function类对象,因此也可以代替回原创 2021-03-06 10:03:12 · 1108 阅读 · 0 评论 -
[C/C++]_[初级]_[关于输出double浮点数精度的方法]
1. 在开发`WTL/Win32`程序时,绘制进度百分比,需要指定这个百分比包括小数点不超过`5`个字符,也就是除了小数点之外的数字个数最多只显示`4`个。已知可能出现的数值有`1.1`,`1.1145`,`22.14`... 用什么方式可以获取需要的字符串呢?原创 2024-03-06 14:32:00 · 464 阅读 · 0 评论 -
[并发并行]_[中级]_[C++实现synchronized方式的对象锁2.0]
1. 在前面的文章说过《C++实现synchronized方式的对象锁》可以实现`Java`的`synchronized`易用特性。这个第一版的例子并没有说明如何删除`pthread_mutex_t`对象,随着加锁的对象增加会出现内存泄漏的情况,怎么解决?原创 2024-01-05 23:35:19 · 567 阅读 · 0 评论 -
[Windows]_[初级]_[创建目录和文件的名字注意事项]
# 场景1. 在开发`Windows`程序时,会出现目录生成了,但是函数无法在目录里创建文件,怎么回事?原创 2023-06-08 14:50:52 · 744 阅读 · 0 评论 -
[C/C++]_[初级]_[声明和使用字符串常量和字节常量]
我们需要存储常量的字节数组,并且数组里的字节数据可以是任意数值`0-255`。怎么存储?原创 2023-03-09 23:31:45 · 476 阅读 · 0 评论 -
[C/C++]_[初级]_[关于把字符串string作为字节数组存储的注意点]
在使用string标准字符串的时候,有时候会把它作为动态字节数组来使用。这个string能不能先存储字节数据,再设置它的字节数据大小?原创 2023-03-09 22:48:49 · 531 阅读 · 0 评论 -
[C++11]_[初级]_[十六进制字符串转换为字节数组]
1. 在开发使用加密算法`md5,sha256等`的功能时, 会生成基于十六进制的字符串密钥。 这时候在使用这些密钥进行解密或加密的时候,第三方库都需要传入一个字节数组`usigned char*`格式的数组,它每个字节的高4位和低4位都分别存储了1个字符值。那么用`C++`如何实现?原创 2023-03-06 17:14:50 · 1400 阅读 · 0 评论 -
[C/C++]_[中级]_[static_cast的详细解析]
1. 在`C++`开发时,会看到四个强制类型转换操作符`const_cast`,`dynamic_cast`,`static_cast`和`reinterpret_cast`。其中`static_cast`的用在什么场景下?原创 2022-11-05 09:35:00 · 627 阅读 · 0 评论 -
[C/C++]_[初级]_[关于编译时出现有符号-无符号不匹配的警告-sizeof使用注意事项]
1. 自从有了`C++11`的`auto`关键字之后,声明变量经常使用它。之后有一次发现编译控制台大量输出`有符号/无符号不匹配`的警告信息。怎么回事?原创 2022-09-23 17:07:19 · 1098 阅读 · 0 评论 -
[C/C++11]_[初级]_[获取CPU支持的最合适的核心线程数]
1. 当使用线程池时,一般需要获取最合适的最大线程数,因为在每个进程每个`CPU`核心最高性能是只处理一个线程。因此可见最合适的线程总数就是`CPU`核心数。那么如何获取`CPU`核心数?原创 2022-09-23 10:19:39 · 1116 阅读 · 0 评论 -
[C++11]_[初级]_[使用std::move移动对象资源]
场景:C++ 标准库使用比如vector::push_back 等这类函数时,会对参数的对象进行复制,连数据也会复制.这就会造成对象内存的额外创建, 本来原意是想把参数push_back进去就行了.C++11 提供了std::move 函数来把左值转换为xrvalue, 而且新版的push_back也支持&&参数的重载版本,这时候就可以高效率的使用内存了.对指针类型的标准库对象并不需要这么做.原创 2016-02-25 11:59:47 · 14935 阅读 · 7 评论 -
[C/C++20]_[初级]_[信号量semaphore]
场景在C++20标准里添加了一个关于线程相关的类:Semaphores, 它在<semaphore>头文件里定义了,那么这个信号类如何使用?说明cppreference 里对信号量的描述:是一种轻量级同步原语,用于约束对共享资源的并发访问。当两者都满足时,信号量可能比条件变量更有效。在开发工具对C++标准的支持版本[1]里要支持C++20特性要在gcc 版本9或vs2019以上才支持。而这个信号在Win323里其实早就存在。而在*ux下系统也有关于信号的C库 <sem原创 2021-05-27 17:48:37 · 717 阅读 · 0 评论 -
[C/C++]_[初级]_[在Windows上导出C++类的动态库]
场景在Windows上使用VS开发C++类的导出dll时,如果我们的类包含了stl的模板成员变量,那么编译时会报以下警告. 如何解决?C4251: “Utils::path_”: class“std::basic_string<_Elem,_Traits,_Ax>”需要有 dll 接口由 class“Utils”的客户端使用1> with1> [1> _Elem=char,1>原创 2021-01-21 17:20:43 · 633 阅读 · 0 评论 -
[C/C++11]_[初级]_[如何转换带井号的#十六进制颜色字符串到数值]
场景表示颜色的RGB值,一般有两种方法,一种是使用使用数值表示RGB(255,255,255),一种是使用字符串#FE07AB.那么字符串形式的表示如何得到r,g,b各值的数值大小呢?说明在<WinGDI.h>里有对RGB宏的定义, 其实就是一个24字节的值,每个颜色值占用8字节。#define RGB(r,g,b) ((COLORREF)(((BYTE)(r)|((WORD)((BYTE)(g))<<8))|(((DWORD)(BYTE)(b))&原创 2020-12-25 17:48:35 · 1063 阅读 · 1 评论 -
[C/C++]_[初级]_[关于使用0初始化结构体的解析]
场景我们在使用Visual Studio开发WIN32程序时,往往需要往调用的函数传递一个C结构体作为参数。而微软给出的结构体初始化至少有三种方式, 问题是用哪一种?// 第一种XX x = {0};// 第二种XX x;memset(&x,0,sizeof(x));// 第三种xx x;ZeroMemory(&x,sizeof(x));说明C标准函数memset进行按字节设置0是没问题的,用的最多。ZeroMemory函数和SecureZeroMe原创 2020-11-26 09:15:56 · 1654 阅读 · 0 评论 -
[C/C++标准库]_[初级]_[删除反转枚举reverse_iterator详解]
场景std::vector里有rbegin()和rend()反转枚举迭代器,我们可以通过这个反转枚举std::vector<T>::reverse_iterator进行倒序迭代,问题是当使用反转枚举时如果有需要删除的元素怎么办?vector.erase()方法的参数只能是索引枚举std::vector<T>::iterator,不能是反转枚举。说明索引枚举和反转枚举是存在下标对应关系如图1. 反转枚举整体向右平移一个元素,它左边第一元素就是.rend(). 通过r原创 2020-10-20 15:54:46 · 1327 阅读 · 1 评论 -
[C++11]_[初级]_[初始化列表和统一初始化语法和语义]
说明1.一个std::initializer_list<E>对象会在以下情况自动创建:一个大括号初始化列表被用在一个构造函数的参数来初始化对象。一个大括号初始化列表被用在右边的赋值操作符或者作为一个函数的参数,并且相对应的赋值操作符和函数接收一个std::initializer_list参数一个大括号初始化列表被auto关键字限制范围时,包括在ranged-for循环里。...原创 2019-10-28 11:00:01 · 724 阅读 · 0 评论 -
[C/C++]_[初级]_[类型转换的说明]
场景C++提供了哪四种类型转换的操作符? 它们分别用在那种情况下?说明C++提供的四种类型转换操作符是dynamic_cast,static_cast,const_cast,reinterpret_cast.以下用例子说明它的使用场景.main.cpp#include <iostream>#include <string>#include ...原创 2019-09-16 18:03:59 · 687 阅读 · 0 评论 -
[C/C++]_[中级]_[多态下引用和指针有什么区别]
场景在开发C++程序, 经常会用到多态引用和指针. 它们有什么区别吗?多态的引用和指针什么时候会调用虚函数表, 什么时候不会?多态的引用和指针它们是调用的子类的方法还是父类的方法?说明引用变量引用变量是C++相对C增加的复合类型, 它是已定义变量的别名,注意是已定义的变量, 必须是指向一个已定义的变量, 因此引用变量在声明时必须初始化。引用类型使用&来...原创 2019-08-23 16:44:18 · 718 阅读 · 0 评论 -
[C++/Objective-C]_[初级]_[关于两种类指针实现的链表]
场景Objective-C的类指针设置为空时官方推荐的都是为nil, 而不是NULL; 这个nil值的最显著的特性是当一个类指针值为nil时,调用这个类指针的方法或属性不会崩溃,程序不会做任何处理,会跳过这个语句,因为后边实际调用的是objc_msgSend函数,这个函数会跳过为nil的处理。那问题来了, 如果是Objective-C的指针为nil时,我们设计的链表算法还有效吗?因为我...原创 2019-08-21 10:42:09 · 891 阅读 · 0 评论 -
[C/C++]_[初级]_[关于C++的虚函数表virtual table的简单说明]
场景在学习C/C++的时候, 总不免碰到文章内提起虚表(virtual table)或者说vtbl, 还有指向这个vtbl的指针vptr; 问题来了, 到时什么是vtbl呢? 它的作用是什么?说明vtbl是C++对象模型里的概念, 也是目前C++内存对象里的关键概念, 它主要是用来实现虚函数的寻找问题. 我们都知道虚函数存在的意义主要还是为了继承和多态. vtbl就是用来查找这些虚函...原创 2019-01-29 16:13:39 · 496 阅读 · 0 评论 -
[C/C++11]_[初级]_[简单介绍C++11对地址对齐的特性]
场景1.在使用一些相关原子操作的函数或指令时, 一般都需要对操作的变量地址进行对齐, 4,8,16…字节对齐.2.在没有引入C++11的alignas指示符之前, 一般都是使用 __declspec(align(4)) int i; // Windows alignas(4) int j; // C++或定义一些存储空间进行计算转换, 参考数据地址对齐. 不同的是前者是编译...原创 2018-04-20 15:49:12 · 1056 阅读 · 0 评论 -
[C/C++11]_[初级]_[nullptr的简单介绍和使用]
场景1.C++11引入了一个空指针类型 nullptr, 他是一个内置类型. 并不是数值0. 2.当一个函数的重载参数是 int 或者 int* 时, NULL都可以作为这个函数的参数, 这样会搞混淆,甚至会编译错误. 当 NULL 代表 0 时并不能很好的表达是一个指针, 容易出错. 现在C++11 的 nullptr 可以编译这个问题.3.事实上大部分 Windows平台上对 NU...原创 2018-04-19 17:18:06 · 1155 阅读 · 0 评论 -
[C/C++11]_[初级]_[关于auto和decltype说明符的简单介绍]
场景1.auto,decltype说明符是C++11新增的类型推导(deduction)说明符, 他们都有各自的使用场景, 作用相互补充.2.搞清楚它们的使用规则对用好这两个说明符能让你用的更加正确; 还有你会发现C++原来那么复杂的其中一个原因就是它的说明符根据表达式,符号(*,&,…)使用情况,环境相当复杂多变,要记住这些区别非常不容易, 单单是这些符号的组合就让人头疼, 做J...原创 2018-04-18 16:03:47 · 449 阅读 · 0 评论 -
[C/C++]_[初级]_[关于数组的初始化问题]
场景1.我们知道栈上创建的POD数组可以使用 {0}初始化,> 第3.9部分, 数组.如果指定了维数 那么初始化列表提供的元素的个数不能超过这个值,否则,将导致编译错误.如果指定的维数大于给出的元素的个数 那么没有被显式初始化的元素将被置为 0.2.对于C++ new 出来的free store数组new int[5] 如何进行初始化是一个头疼的问题. 因为大部分书里也没提到原创 2018-01-16 15:45:21 · 2059 阅读 · 0 评论 -
[C/C++]_[初级]_[关于std::string的compare陷阱]
场景1.std::string 我们经常用来存储字符串数据, 当然它也可以作为byte的存储器,存储任意字节.2.通常情况下我们使用 std::string 的 compare 方法比较字符串, 但这个方法比较奥字符串是不可靠的.说明1.compare 方法和 strcmp并不相同, 它比较的是 std::string size()大小里的所有字节.在size() 长度范围里, 如果有’\0’字符,原创 2017-05-05 06:24:37 · 7121 阅读 · 4 评论 -
[数据结构]_[C/C++]_[链表的最佳创建方式]
场景1.链表在C/C++里使用非常频繁, 因为它非常使用, 可作为天然的可变数组. push到末尾时对前面的链表项不影响. 反观C数组和std::vector, 一个是静态大小, 一个是增加多了会对之前的元素进行复制改写(线程非常不安全).2.通常创建链表都是有next这样的成员变量指向下一个项, 通过定义一个head,last来进行链表创建. 参考函数 TestLinkCreateStupid()原创 2016-10-22 00:51:54 · 1410 阅读 · 2 评论 -
[C/C++]_[初级]_[原子操作1]
场景现在多线程基本是开发应用必备的解决同步阻塞的解决方案,比如在分析日志文件时在界面显示分析进度;多线程修改或读取同一个变量来记录容器里的对象个数等等.如果是每次都使用互斥量对变量加锁,那么加解锁是非常耗费CPU时间的. 所以使用CPU提供的无锁指令是一个必然的选择.互斥量的坏处之一就是容易造成死锁,所以一般只在重量级的容器对象才会加互斥锁. 比如:pthread_mutex_lock每个原创 2016-04-05 10:17:55 · 2818 阅读 · 0 评论 -
[C++11]_[初级]_[左值引用声明和右值引用声明]
场景:在 remove_reference 结构体中能看到右值引用的身影 &&, 那么这里的右值引用到底有什么用呢?经常也发现int& 和int&& 这两种类似的应用类型,第一种是左值引用声明,第二种是右值引用声明.以下的例子直接参考的 cppreference,已经写的很完整了,没必要重新写.参考:1.Reference declaration 2.Rvalue Reference De原创 2016-02-25 14:34:19 · 2430 阅读 · 0 评论 -
[C/C++不常见语法特性]_[初级]_[左值-右值-lvalue-rvalue]
场景:1. C++11 引入了std::move,它可以高效率的从一个左值资源移动到另一个左值资源里, 这个过程不需要再创建新的资源. 这对std::string,std::vector这种标准库的资源 操作更加精炼.使用标准库时会大量使用这个std::move模板函数.2. 在std::move的源码里又涉及到std::remove_reference 模板结构体,这个结构体又涉及到 "右值引用声明(Rvalue Reference Declarator: &&)", 所以这里还是讲原创 2016-02-18 14:45:28 · 3064 阅读 · 0 评论 -
[C/C++]_[初级]_[static_cast,reinterpret_cast,dynimic_cast的使用场景和区别]
场景:1. C++的对象区别于C的原因是他们可以有继承关系, 方法有重载, 覆盖关系等, 他们的对象内存数据结构因此也比较复杂.2. 很多情况下我们需要一个父类来存储子类的指针对象进行通用方法的操作,涉及到具体某个子类对象特定操作时又需要强制转换为子类,那么这时候该用什么好呢?原创 2016-02-04 00:08:00 · 3069 阅读 · 0 评论 -
[C/C++]_[初级]_[关于static修饰符的说明]
场景:1. static 修饰符具有静态共享特性, 在C/C++里一般用来作为共享变量使用,或者节约内存声明的常量或不改变大小的存储区.2. static活用的话也可以作为单例模式的便捷方式.[并发并行]_[线程同步]_[C/C++实现单例模式分析]3. 总的说来static是文件范围内可见的,或类,函数范围内可见的. 注意: 非全局可见的.4. 注意, 文件范围内可见的static(一种是文件内声明的静态变量,一种是类静态成员变量)会在main执行前先执行, 如果是类, 那么会调用构造函数, 如原创 2015-12-11 23:41:22 · 2698 阅读 · 4 评论