自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(63)
  • 问答 (5)
  • 收藏
  • 关注

原创 批量文件拷贝

文件批量拷贝到指定目录

2023-11-06 16:59:38 110

原创 关于JS的Promise中异步执行c++函数resolve和reject回调次数不准确的问题

GetCurCameraPropertySetting函数是c++中的异步函数,该函数中第二个参数是回调函数,由c++线程调用线程安全函数放入渲染进程再由渲染进程回调到JS层。在GetCurCameraPropertySetting函数中,resolve和 reject参数没有被传递到c++层,再JS回调函数被执行时resolve和 reject参数不知是进行匹配的,这里可能发生错误(改原因分析没有经过验证)。JS的Promise中异步执行c++函数resolve和reject回调次数不准确的问题。

2023-05-18 11:11:00 208

原创 批处理命令记录

windows中xcopy的拷贝和重命名,防止手动确认选择拷贝

2022-10-26 15:11:28 1130

原创 拷贝指定文件夹下文件 —— python

使用脚本进行文件拷贝,调试问题时自动进行文件替换,提高调试效率。

2022-10-08 17:53:15 256

原创 C++实战

1. 预定义宏__cplusplus:C++语言的版本号。如:202002(c++20),201703(c++17),201402,201103__DATE__ :预处理时的日期__FILE__ :源文件名__LINE__ :源文件行号__has_include:是否存在某个可包含的文件__cpp_modules:是否支持模块机制__cpp_decltype:是否支持decltype特性__cppdecltype_auto:是否支持decltype(auto)特性__cpp_lib_ma

2022-05-29 21:21:49 482

原创 49~52new和delete

文章目录@[toc]一、了解new-handler的行为二、了解new和delete的合理替换时机三、编写new和delete时需固守常规四、写了placement new 也要写placement delete一、了解new-handler的行为set_new_handlernamespace std{ typedef void (*new_handler)(); new_handler set_new_handler(new_handler p) throw();//trhow

2022-05-22 16:07:03 151

原创 32~40继承与面向对象设计

一、确定你的public继承塑模出is-a关系piublic inheritance意味着“is-a”的关系。适用于base classes身上 的每一件事情一定也适用于derived classe身上,因为每一个derived classe对象也是一个base classe对象 。现实或数学逻辑上是is-a关系的事务,在程序的世界并不一定是is-a的关系。考虑Penguin(企鹅) 、Bird和Square、Rectangle的例子。二、避免遮掩继承而来的名称全局变量和局部变量的遮掩

2022-05-22 08:23:56 279

原创 31 将文件的编译依存关系降至最低

一、class定义式中包含实现细目class Person{public: Person(const std::string& name,const Date&birthday, const Address& addr); std::string name() const; std::string birthDate() const; std::string address() const; ...private: //实现细目

2022-05-20 11:31:09 200

原创 生成UUID的几种方式

一、boost库#include <boost/uuid/uuid.hpp>#include <boost/uuid/uuid_io.hpp>#include <boost/uuid/uuid_generators.hpp>boost::uuids::uuid my_uuid = boost::uuids::random_generator(); std::string uuid_to_string = boost::uuids::to_string(a_uu

2022-05-19 22:56:45 6967

原创 30 透彻了解inlining的里里外外

一、了解inline优点:可以免除函数调用成本编译器有能力对inline函数执行语境相关最优化,编译器最优化机制的设计目的是通常是为了优化“不含函数调用”的代码可能导致较小的目标代码和较高的指令告诉缓存装置击中率缺点:对inline函数的每一个调用都以函数本体替换,会增加目标代码的大小。过多的inline会造成程序体积太大、代码膨胀亦会导致额外的换页行为,降低高速缓存装置的击中率inline只是对编译器的一个申请,不是强制命令二、inline声明方式隐喻方式: 将函数定义于cl

2022-05-13 09:50:41 182

原创 28 29 为“异常安全”而努力是值得的

一、异常安全函数提供以下三个保证基本承诺:如果异常被抛出,程序内的任何事务仍然保持在有效状态下。没有任何对象或数据结构会因此而败坏,所有对象都处于一种内部前后一致的状态(例如所有的class约束条件都继续获得满足)。如果含函数出现异常,程序有可能处于任何状态——只要那是个合法状态。强烈保证:如果异常抛出,程序状态不改变。调用这样的函数需要有这样的认知:如果函数成功,就是完全成功,如果函数失败,程序会回复到“调用函数之前”的状态。不抛异常保证:承诺不抛出异常,因为他们总是能够完成他们原先承诺的功能。作

2022-05-11 16:34:29 181

原创 27 尽量少做转型动作

一、旧式转型(C风格)(T)expression 强制转型,将expression转型为TT(expression) 函数式转型,将expression转型为T二、新式四种转型(C++风格)const_cast(expression)通常被用来将对象的常量性转除。唯一有此能力的C+±style转型操作符。dynamic_cast(expression)主要用来执行“安全向下转型”,也就是用来决定某对象是否归属继承体系中的某个类型。它是唯一无法用旧式语法执行的动作,也是唯一可能耗费重大

2022-05-10 20:20:57 194

原创 26 尽可能延后变量定义式的出现时间

一、现象情况1:过早定义变量会导致变量存在未被完全使用的情况,增加构造析构的成本。std::string encryptPassword( const std::string& password ){ using namespace std; string encrypted; if(password.length() < MinimumPasswordLength){ throw logic_error("Password is too sho

2022-05-10 17:47:16 153

原创 windows系统睡眠与合上盖子事件捕获

2022-05-10 13:19:03 2109

原创 25 考虑写出一个不抛异常的swap

一、std::swapstd::swap面对指针(如pImpl写法)时效率低,因此需要重写swap1.1 如何重写swap为标准库提供特化版本(全特化)//pImpl写法的Widgetclass WidgetImpl{public: ... void swap(Widget& other){ using std::swap; swap(pImpl,other.pImpl); }private: int a,b,c;

2022-05-09 21:46:23 345

原创 20 21参数传递及返回值和引用关系

20 宁以pass-by-reference-to-const替换pass-bu-value一、原因按值传递会创建对象副本,多次调用构造和析构,效率低。按引用传递不会创建对象,效率高。按引用传递可以避免对象切割问题。derived class对象按值传递,并被视为一个base class对象,base class的copy构造函数会被调用,derived class对象的行为会被丢掉。二、内置类型在编译器底层,references往往以指针实现出来。 pass by reference 通常

2022-05-09 20:17:31 149

原创 23 24 什么时候用non-member函数替代member函数

23 宁以 non-member、non-friend 替换member函数,可增加封装性、包裹弹性和机能扩充性non-member non-friend 函数相对于member和friend函数而言,具有更大的封装性,因为它不能够访问class内之private成分。non-member 可以是另一个class 的member,如工具类。C++中比较自然的做法是让non-member成为与class同一命名空间中的non-member函数,常称为便利函数。当某个class拥有大量的便利函数时,可

2022-05-09 20:06:28 494

原创 c++对象模型

一、什么是c++对象模型语言中直接支持面向对象程序设计的部分。对于各种支持的底层实现机制。二、c++对象的布局成本成员函数不占用成本member functions虽然再class的声明之内,却不在object之中。每一个non-inline member function只会诞生一个函数实例。 每一个“拥有零个或一个定义”的inline function则会在其每一个使用者(模块)身上产生一个函数实例。c++在布局以及存取时间上主要的额外负担是由virtual引起的virtual

2022-05-06 21:06:46 1814

原创 静态联编和动态联编

一、什么是联编联编:将源代码中的函数调用解释为执行特定的函数代码块被称为函数名的联编(binding)。静态联编: 在编译过程中进行联编被称为静态联编,又称为早期联编。动态联编:编译器必须生成能够在程序运行时选择正确的虚方法的代码,这被称为动态联编,又称为晚期联编。二、为什么有两种类型的联编以及为什么默认为静态联编?效率动态联编效率低。因为要跟踪基类指针或引用指向的对象类型,增加了额外开销。如果类不需要作为基类,则不需要动态联编。如果派生类不需要重新定义类的任何方法,不需要动态联编。

2022-05-05 09:48:26 1747

原创 19 设计class犹如设计type

■ **新type的对象应该如何被创建和销毁?**这会影响到你的class的构造函数和析构函数以及内存分配函数和释放函数(operator new,operator new[],operator delete和operator delete[])的设计,当然前提是如果你打算撰写它们。■ **对象的初始化和对象的赋值该有什么样的差别?**这个答案决定你的构造函数和赋值(assignment)操作符的行为,以及其间的差异。很重要的是别混淆了“初始化”和“赋值”,因为它们对应于不同的函数调用。■ **新typ

2022-05-03 16:33:19 224

原创 18 让接口容易被正确使用,不易被误用

一、通过导入新类型来预防错误struct Day{ explict Day(int d) : val(d){} int val;}struct Month{ explict Month(int d) : val(d){} int val;}struct Year{ explict Year(int d) : val(d){} int val;}class Date{public://Date(int m,int d

2022-05-02 22:41:13 235

原创 13 14 15 16 17对象管理资源

13 以对象管理资源一、对象管理资源(智能指针)获得资源后立刻放进管理对象内以对象管理资源的观念常被称为“资源取得的时机便是初始化时机(Resource Acquistion Is Initialization;RAII)”管理函数运用析构确保资源被释放。14 在资源管理类中小心copying行为并非所有的资源都是heap-based,如Mutex,需要lock和unlock操作。此时你需要编写自己的资源管理类。需要注意copying 函数的行为。当你自己编写的资源管理类发生复制时,泥坑

2022-05-01 23:49:21 145

原创 12 复制对象时勿忘其每一个成分

一、当增加新的成员变量时如果你为class添加一个新的成员变量,你必须同时修改copying函数。也需要修改class所有的构造函数以及任何非标准形式的operator=。此种情况编译器不会报错。二、当发生继承时为derived class撰写copying函数时,必须使用base class的copying函数复制其base class成分。因为base class中往往包含private的成员变量。三、不要尝试用一个copying函数实现另一个copying函数用copy assignmen

2022-05-01 22:24:30 201

原创 11 在operator中处理自我赋值

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入欢迎使用Markdown编辑器你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar

2022-05-01 21:44:07 166

原创 9 绝不再构造和析构中调用virtual函数 10 operator=

一、为什么不要在构造和析构中调用virtual函数构造中调用virtual函数,virtual函数不会下降到derived classes。原因:1)base class构造函的执行早于derived class构造函数,当base class构造函数执行时derived class的成员变量尚未初始化。而derived class的成员函数几乎必定会调用local成员变量,这会导致未定义行为,因此c++禁止;2)derived class对象的base class构造期间,对象的类型是base

2022-04-30 23:26:57 884

原创 8 别让异常逃离析构函数

一、为什么析构函数中不能要吐出异常析构函数中有异常会导致资源泄露。如:析构函数中有异常发生,可能会导致异常后的资源得不到释放。更为严重的是如果vector中包含10个对象,析构第一个元素的时候抛出了异常,但是其他的对象还是应该被销毁,析构第二个元素的时候又抛出了异常。在两个异常同时存在的情况下,程序若不是结束执行就是导致不明行为。二、如果析构函数必须执行会抛出异常的动作,该如何处理如果析构函数必须执行抛出异常的动作,有两种方案解决:1)捕获异常,终止程序(使用abort);2)捕获异常,吐下它

2022-04-30 22:56:30 201

原创 07 为多态基类声明虚析构函数

一、多态基类为什么要声明虚析构函数当derived class对象经由一个base class指针被删除,而该bass class 带着一个non-virtual吸狗善书,其结果未有定义——实际执行时通常发生的是对象的的derived成分没有被销毁。二、为什么多态基类中声明为虚析构函数,派生类就会被析构?析构函数的运作方式:最深层派生的那个class其析构函数最先被调用,然后是其每一个base class的析构函数被调用。(运作方式如何实现的?见下段粗体字。 )抽象类的析构函数声明为纯虚析构函数:

2022-04-30 22:33:47 246

原创 5 c++默认编写了哪些函数

一、c++默认编写了哪些函数copy构造函数、一个copy assignment操作符和一个析构函数、default构造函数。当这些函数被需要时,它们才会被编译器创建出来。注意:编译器产出的析构函数是个non-virtual,除非这个class的base class自身声明有virtual析构函数(这种情况下这个函数的虚属性virtualness主要来自base class.)。二、这些函数做了哪些操作copy构造函数和copy assignment操作符:将来源对象的每一个non-static

2022-04-30 21:34:33 992

原创 确定对象使用前已先被初始化

1.初始化规则如果使用C part of C++而且初始化可能招致运行期成本,那么就不保证发生初始化。non-C parts of C++,规则有些变化。这就很好地解释了为什么array(来自C part of C++)不保证其内容被初始化,而vector(来自STL part of C++)却有此保证2. 使用初始化列表区分赋值和初始化C++规定,对象的成员变量的初始化动作发生在进入构造函数本体之前。初始化列表中的是初始化,构造函数中的是赋值,赋值之前会先调用default构造函数进

2022-04-24 21:26:35 851

原创 尽可能使用const

const 出现在*左边,表示被指物是常量,出现在*右边,表示指针自身是常量。迭代器中的const:1)const_iterator的作用为:const T* 和T const *2)const std::vector<int>::iterator iter;等同于:T* constconst修饰返回值的作用是防止返回值被错误的赋值,如:class Rational{...};const Rational operator*(const Rational& ...

2022-04-24 13:15:46 186

原创 计算机中个各个模块之间如何传递数据

计算机中的二进制数据是如何表示的

2022-04-20 20:50:34 946

原创 模板 —— 函数

一、模板是否需要指定模板形参语法:template < 形参列表 > 声明template <typename T> T fun(T t) { return T();}涉及到模板型别推导时,不需要指定模板形参//涉及到模板型别推导template <typename T> T fun(T t) { return T();}func(1);未涉及到模板型别推导时,需要指定模板形参//未涉及到模板型别推导template <type

2022-04-11 15:11:42 130

原创 Cmake

1.构建系统介绍构建系统描述如何使用构建工具从其源代码构建项目的可执行文件和库,以自动化该过程。例如,一个构建系统可能是与命令行生成工具一起使用的Makefile,或者是集成开发环境(IDE)的项目文件。为了避免维护多个这样的构建系统,一个项目可以使用用CMake语言编写的文件抽象地指定它的构建系统。源代码树 —— 源代码顶级目录包含项目提供的源文件的顶级目录。该项目使用cmake-language(7)手册中描述的文件指定它的构建系统,从一个名为CMakeLists.txt的顶级文件开始。这些文件指

2022-04-11 12:30:52 1963

原创 webrtc -- audiomodule

模块路径:moudlues > audio_device:文件所属工程:audio_device_module_from_input and_and_output:audio_device_factory(文件夹>include)namespace webrtc {rtc::scoped_refptr<AudioDeviceModule> CreateWindowsCoreAudioAudioDeviceModule(TaskQueueFactory* task_que

2022-04-11 12:29:02 243

原创 CMakeVS工程筛选器分组

FILE 全局搜索文件存入变量中#全局搜索.h和.cpp文件放入LOGWIN变量中FILE(GLOB LOGWIN "log/logan-win/*.h" "log/logan-win/*.cpp")FILE(GLOB CLOGAN "log/logan-win/Clogan/*.h" "log/logan-win/Clogan/*.c")FILE(GLOB MBEDTLS_INCLUDE "log/logan-win/mbedtls/include/mbedtls/*.h" )FILE(GL.

2022-04-06 12:19:21 762

原创 左值引用和右值引用

一、左值和右值glvalue 可寻址的表达式,即可使用&操作符的表达式prvalue 只读表达式,即不可使用&操作符的表达式xvalue 延长了生命周期的表达式,即右值引用lvalue 等号左边的值rvalue 等号右边的值二、左值引用和右值引用引用是一种类型左值引用:普通的引用右值引用:可以延长临时对象的生命周期三、移动构造四、模版...

2022-03-19 20:52:22 9841

原创 dumpbin

dumpbin link.exe /headers | findstr "machine"

2022-03-16 09:22:21 713

原创 VS命令行工具解释

x86 native tools command prompt

2022-03-16 09:03:50 1701

原创 命令行编译VS工程

命令行编译VS工程"C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\IDE\devenv.com" .\build\Release\x64\xxx.sln /BUILD "Release|Win32"

2022-03-15 14:41:03 2847

原创 正则表达式

1.std::regex_match目标字符串需要完全匹配正则表达式,目标字符串一个也不能多。2.std::regex_search搜索目标字符串中第一个匹配正则表达式子串。3.std::regex_replace待补充4.std::match_resultsstd::match_results可以作为std::regex_match和std::regex_search参数,匹配后会对std::match_results进行填充,std::match_results中的每一项为sub_matc

2022-02-22 13:09:33 523

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除