
C/C++
文章平均质量分 60
123axj
这个作者很懒,什么都没留下…
展开
-
std::mutex & sc_core::sc_mutex
调用lock时,如果mutex处于lock状态,说明其他线程正在使用,则此线程需要等待,直到使用的那个线程调用了unlock,让mutex处于unlock状态后,本线程等待结束,调用lock成功。否则执行lock的动作,返回true。需要注意的是,调用unlock的前提必须是当前thread调用了lock或try_lock使mutex处于lock状态,否则将会导致不可预知的问题。如果当前mutex是lock状态,但是由其他process 执行的lock/ try_lock导致的,则返回-1;原创 2022-08-24 21:37:56 · 469 阅读 · 0 评论 -
C++ 虚继承
参考 虚继承_饭_团的博客-优快云博客_虚继承虚继承:主要解决棱形继承时,出现的内存访问冲突问题。声明格式:class 类名 :virtual 继承方式 类名继承方式可以缺省,缺省之后默认继承方式为 private 私有继承。注意,代码中class D的初始化列表顺序需要为A ->B -> C,也就是实际执行时,构造函数的调用顺序。#include <iostream>#include <string>using namespace st...原创 2022-05-02 21:49:01 · 1043 阅读 · 0 评论 -
计算机大小端 及 内置类型字节长度
计算机系统是以字节为单位进行存储的,每个地址单元都对应着一个字节,一个字节为 8bit。但是在C/C++语言中除了8bit的char类型之外,还有int、long、float、double等多字节的内置数据类型,那么必然存在着一个如何将多个字节安排的问题。因此就导致了大端存储模式和小端存储模式。KEIL C51则为大端模式。X86、很多的ARM,DSP都为小端模式。 大端...原创 2020-05-01 17:40:46 · 276 阅读 · 0 评论 -
strcpy()、strncpy()和strcpy_s()区别
转载:https://www.cnblogs.com/lianshuiwuyi/p/7784870.html1、strcpy()原型:char *strcpy(char *dst,const char *src)功能:将以src为首地址的字符串复制到以dst为首地址的字符串,包括’\0’结束符,返回dst地址。要求:src和dst所指内存区域不可以重叠且dst必须有足够的空间来容纳src的字符串,若dst空间不足,编译时并不会报错,但执行时因系统不同会出现不同的结果:Mac系统提示“Abort tra转载 2020-05-17 11:08:28 · 789 阅读 · 0 评论 -
memcpy和memmove
memcpy和memmove都是C语言中的库函数,在头文件string.h中,作用是拷贝一定长度的内存的内容,唯一的区别是,当内存发生局部重叠的时候,memmove保证拷贝的结果是正确的,memcpy不保证拷贝的结果的正确。如果我们非想使用memory来处理有局部重叠的copy动作时,可以考虑自己再写一个memory的实现函数,覆盖掉标准库的实现方式。以下是自己写的一个实现方法,网上很多。...原创 2020-03-22 15:19:07 · 241 阅读 · 0 评论 -
模板类的分离式编译
对程序进行编译时,对于函数调用,编译器只要求函数的原型在调用点是可见的,至于函数的定义是否存在不做检查(在对程序进行链接时才检查函数的定义)。类似的,对于对象声明,编译器只要求所属的类定义在声明点是可见的,至于各成员函数的定义是否存在则不进行检查。因此,为了提高程序的可读性和可维护性,我们通常将函数原型和类定义放在头文件(.h文件)中,而函数定义(包括类成员函数的定义)则放在源文件(.cpp文件,又称实现文件)中。但是,模版编译则有所不同。从本质上说,模版并不是代码,而是指导编译器生成代码的指令,模版实例原创 2020-05-23 08:42:21 · 457 阅读 · 0 评论 -
std::is_trivially_destructible
std::is_trivially_destructible来判断 一个 内置类型或structure/class/union类型 是否为 “容易销毁的(trivially destructible)”,从字面意思也可以看出,主要是check这个类型的 析构函数。官网给出如下解释:A trivially destructible class is a class (defined with class, struct or union) that:uses the implicitly define原创 2022-03-27 09:59:10 · 2896 阅读 · 0 评论 -
bazel 简单使用
Bazel是google开发的一个开源编译工具,类似与makefile的功能。Bazel支持多种语言的项目(比如C/C++ /Python),并为多种平台构建输出。Bazel支持跨多个存储库的大型代码库以及大量用户。Bazel的安装官方文档就是个很好的介绍https://docs.bazel.build/versions/1.2.0/install.html比如在ubuntu上的安装过程如下截图 ( https://docs.bazel.build/versions/1.2.0/install-原创 2021-03-18 11:08:29 · 3290 阅读 · 0 评论 -
GDB常用命令总结
GDB是我们在C/C++编程中常用的debug工具,常用GDB命令如下表。使用GDB之前,需要保证你的Makefile中的相关编译选项配置成 –g –O0加了 –g编译选项才能使用GDB调试,-O0是要你关闭所有编译器优化,因为编译器优化可能会改变行数,甚至改变你的代码结构,不便于debug,并且dgb时会出现各种奇怪的问题。如果是bazel build的可执行文件,需要 保证编译的是debug版本,一般可加 -c dbg 的选项来编译。如果调试的程序 有输入参数,可以使用 gdb --ar原创 2020-03-16 20:26:32 · 997 阅读 · 0 评论 -
C++必须用初始化列表进行初始化的场景
《C++ Primer》 P258 7.5.1构造函数初始化列表 一节类成员为const类型(const 类型在 C++11中,还可以使用 类内初始化方式,也就是直接在声明的时候进行初始化) 类成员为引用类型const对象或引用只能初始化但是不能赋值。构造函数的函数体内只能做赋值而不是初始化,因此初始化const对象或引用的唯一机会是构造函数函数体之前的初始化列表中。从无到有叫初始化,初始化(调用拷贝构造函数)创建了新对象;赋值(调用赋值操作符)没有创建新对象,而是对已有的对象赋值。 ...原创 2021-05-26 20:23:16 · 775 阅读 · 0 评论 -
C++ 单例模式
单例就是一个类在全局只被例化一次。单例可以减少不必要的new/delete过程,提高performance。单例的实现方法参考 https://www.cnblogs.com/sunchaothu/p/10389842.html其中,构造函数设置为private,也就是不能从外部来new 一个对象,只能通过类内的get_instance函数来new。=delete 阻止拷贝 和 赋值运算符。=delete,用于定义删除函数,在旧标准下,我们如果希望阻止拷贝可以通过显式声明拷贝=defaul.原创 2021-04-01 16:58:17 · 256 阅读 · 0 评论 -
C/C++ 添加命令行 参数选项
在linux下使用gcc/g++编译代码时,大家都用过类似这样一条指令:gcc helloworld.c -o helloworld.out; 这条指令中的-o就是命令行的选项,而后面的helloworld.out就是-o选项所携带的参数。命令行参数可以分为两类,一类是短选项,一类是长选项,短选项在参数前加一杠"-",长选项在参数前连续加两杠"--",如terminal下输入man ls(ls 命令参数)所示,其中-a,-A,-b都表示短选项,--all,--almost-all, --author都表原创 2021-03-25 14:24:15 · 5470 阅读 · 1 评论 -
C++获取终端命令行输入std::getline 和readline
c++获取终端命令行的输入字符串,常用方法有std::getline和linux库函数readline。cin和scanf也可以得到终端命令行的输入,但是其遇到空间就会结束,不是特别的好用。而std::getline和readline 不会忽略space、tab,遇到Enter才会结束,可适用大部分场景。readline的使用需要注意以下几点:需要先check下自己的linux系统是否安装了readline库,如果没有安装,ubuntu上执行sudo apt-get install libreadl原创 2021-03-08 20:43:03 · 8820 阅读 · 0 评论 -
C++ 正则表达式
正则表达式regex(regular expression)是一种强大的描述字符序列的工具。在许多语言中都存在着正则表达式,C++11中也将正则表达式纳入了新标准的一部分,使用时需要include头文件 <regex>。Python中有re.match / re.search / re.sub / re.compile / re.finditer这些功能;C++的regex有std::regex_match / std::regex_search / std::regex_replace..原创 2021-03-08 20:40:59 · 836 阅读 · 0 评论 -
C/C++ define的用法
define是C语言中的预处理指令,在编译预处理时进行简单的替换,不作正确性检查,不管含义是否正确照样带入,只有在编译已被展开的源程序时才会发现可能的错误并报错。#define 不是语句,不要在行末加分号,否则 会连分号一块置换。#define 的作用域为自 #define 那一行起到源程序结束。如果要终止其作用域可以使用 #undef 命令,格式为:#undef 标识符。#undef 用得不多,但大家要了解。##在C/C++中具有连接字符串的作用。例如:执行完A ## B后变为AB(连..原创 2021-03-08 10:13:09 · 3208 阅读 · 0 评论 -
C++ override / overload / final
Override 重写,基类定义了一个虚函数,派生类定义了一个同名函数,且返回值类型或函数参数个数、参数类型三者必须保证与基类一致,才能实现 多态。有些时候会在派生类的函数后加override关键字,这是显式表示派生类将重写基类函数,可防止一些低级错误。参考 https://www.cnblogs.com/whlook/p/6501918.html, 同时,这篇博客中也介绍了 final关键字的作用:“当不希望某个类被继承,或不希望某个虚函数被重写,可以在类名和虚函数后添加final关键字,添加final原创 2021-02-14 09:20:15 · 225 阅读 · 0 评论 -
C++ Lamda表达式的一个妙用
在项目编程中,经常会遇到类似这样的需求:当verbosity设置大于等于1时,打开debug打印;否则关闭打印。以下是一种常见的实现方法,因为log可能需要进行一些拼接或者计算,故在一个print_log函数中实现。但这样做有一个问题,即使m_verbosity配置为0,print_log()这个函数作为debug的实参,也会被调用一次,只是最后在debug函数的执行过程中,没有cout打印出来,这样其实是浪费了CPU的性能的。class MyTest{ ...public:原创 2021-01-30 13:38:35 · 361 阅读 · 0 评论 -
C++ 关键字: extern
Extern用作变量声明,而不是变量定义,变量赋值时前面不用加extern。 在大型项目编程中,为了使代码结构清楚明了,往往会用不同的.h/.cpp文件来实现不同的功能模块。如果在模块A.h中定义了一个全局变量,在模块B.cpp中也想使用这个变量,此时就需要用到C/C++的关键字:extern。为什么必须要使用extern,因为C/C++有以下规则: 同一个变量或函数,能且只能被定义一次,但是可以被多次声明。 变量声明 规定了变量的类型和名字,...原创 2020-05-23 11:40:09 · 314 阅读 · 0 评论 -
C/C++节约存储数据空间的方法:位域
有些时候,根据一个数据的取值范围(主要看最大取值),其在存储时并不需要占用一个完整的字节,只需要占用一个或几个二进制位即可。例如开关只有通电和断电两种状态,用0和1表示足以,也就是用一个二进位。为了节省存储空间,并使处理简便,C/C++语言又提供了一种数据结构,叫做“位域”或“位段”。位域的定义和位域变量的说明位域定义与结构定义相仿。 struct 位域结构名 { 位域列表 }; 其中位域列表的形式为: 类型说明符 位域名:位域长度。 比如,我们想用一...原创 2020-05-23 10:10:06 · 1655 阅读 · 0 评论 -
C/C++ :Sizeof 的用法
Sizeof有以下特点:Sizeof是C/C++中的一个运算符,不是一个函数,返回值为size_t sizeof不能被编译成机器码,编译过程中就会计算sizeof的具体值,然后用值替换掉sizeof ()。所以可以用sizeof() 来定义数组的维数。 sizeof ()里面的内容也不能被编译,而是被替换成类型。 sizeof 后面可以直接加变量名,不用加();sizeof一个类型时,必...原创 2020-05-05 16:32:47 · 4370 阅读 · 0 评论 -
C/C++ 内存中的数据对齐
数据对齐,就是 数据所在的内存地址必须是该数据长度的整数倍,以64bit CPU为例,比如short变量的内存起始地址必须是2的整数倍,int/float必须是4的整数倍,long/double/指针类型 必须是8的整数倍,long double必须是16的整数倍。Bool/char为1byte,起始地址就任意了。 对于一个结构体来说( class或struct) ,总...原创 2020-05-05 11:09:43 · 626 阅读 · 0 评论 -
C/C++中的逻辑右移和算术右移
逻辑左移和算术左移,都是在右边补0,效果一样。左移1bit,相当于原数 乘以2。逻辑右移:右移后,左边补0算术右移:右移后,左边补符号位,添加的位与原数的符号位相同,正数(0算作正数的一个)补0,负数补1。算术右移1bit,相当于原数 除以2。C/C++中,对于无符号数,可以认为是逻辑左移和逻辑右移。对于有符号数,可以认为是算术左移和算术右移,要对一个有符号数 执行逻辑右移,可以先...原创 2020-05-04 17:09:04 · 6659 阅读 · 0 评论 -
C/C++隐式数据类型转换 与 整型提升
C/C++中规定了一组内置类型的隐式类型转换规则,用于类型不一致的运算过程中。算术运算,如 int + short + double 时,int和short的变量会隐式转换为double,再与double进行加法。 关系运算,如 if ( int < unsigned int),会转换为较宽类型的unsigned int 赋值运算,如int = double,double的变...原创 2020-05-04 15:09:13 · 1573 阅读 · 0 评论 -
C/C++ 数字常量的前缀和与后缀
C/C++中,我们经常会用到诸如0x100、100、0b1101这类的数字常量,这里的0x 0b就是数字常量的前缀,分别表示此数字是十六进制和二进制。100 不加任何前缀,表示十进制数。我们有时候也会见到一些诸如 0x1FFFFUL、0x1FFFFULL 、0x1FFFFLL、1.8F之类的数字后缀,这里的UL表示unsigned long,ULL表示unsigned long long,LL 表示signed long long,F表示Float浮点数。也可以用数值后面加H或B来表示十六进制和二进制.原创 2021-01-29 16:14:40 · 2843 阅读 · 0 评论 -
C++输出流格式
C语言中,我们通常会使用 scanf 和 printf来进行输入输出操作。C++中依然可以使用scanf 和 printf,同时又增加了一套新的、更容易使用的标准输入输出库cin和cout。需要注意的是,cin 和cout都是 C++ 的内置对象,而不是关键字 (scanf 和 printf也不是关键字,而是C语言中定义的函数)。cin 和cout 分别是istream 和ostream 类的...原创 2020-03-29 16:37:21 · 406 阅读 · 0 评论 -
C和C++的相同和不同点
注:以下内容大部分为从互联网上整理而来,纯粹为了学习。C++之名是Rick Mascitti在1983年夏天定名的(参见The C++ Programming Language(Special Edition)1.4节),C说明它本质上是从C语言演化而来的,“++”是C语言的自增操作符。C++语言是C语言的超集,是在C语言基础上进行的扩展(引入了new、delete等C语言中没有的操作符,增加...原创 2020-03-21 23:29:29 · 1534 阅读 · 0 评论 -
C++析取器在代码自动化测试中的应用
在C++中,有一个stream这个类,所有的I/O都以这个“流”类为基础的,stream这个类有两个重要的运算符:1.插入器(<<)向流输出数据。比如说系统有一个默认的标准输出流(cout),一般情况下就是指的显示器,所以,cout<<"Write Stdout"<<'\n';就表示把字符串"Write Stdout"和换行字符('\n')输出到标准输出...原创 2020-03-21 22:57:33 · 312 阅读 · 0 评论 -
自定义类型使用STL关联容器
上次总结STL容器时有提到,我们不能直接把自定义类型作为关联容器set或map的key。C++编译器会报错的。如果想这样做,需要对自定义类型规定一个< 运算符。 方法1:在自定义类型内定义<运算符。 源代码示例如文章最后。需要注意以下几点。bool operator< (const Test_Data & cmp) const 中,参数类型必须是cons...原创 2020-03-19 20:49:47 · 811 阅读 · 0 评论 -
STL容器及简单使用总结
STL ( Standard Template Library) 的目的是标准化组件,这样就不用重新开发,可以使用现成的组件。STL是C++的一部分,因此不用安装额外的库文件。STL是一种泛型编程。面向对象编程关注的是编程的数据方面,而泛型编程关注的是算法。(不是很懂)STL主要包括容器(containers)和算法(algorithms),以下是自己对几个主要的STL容器的理解。 ...原创 2020-03-16 21:59:37 · 933 阅读 · 3 评论 -
用 std::function 函数指针的形式实现多态
假如有这样一种需求:有一个模块A会被很多模块使用;而不同模块在使用时,需要A中的一个函数完成不同的功能。 首先,我们可以使用虚函数来实现:A中定义一个基类,基类中有一个虚函数;不同模块对这个虚函数进行重写,以实现不同的功能。 其次,也可以用函数指针来实现,C++11的新特性std::fcuntion可更方便地实现。A中定义一个 std::function的成员变量,一个public的注册函数,用于其他模块向A模块申请注册不同的函数实现。 std...原创 2020-10-18 21:01:07 · 1643 阅读 · 0 评论 -
git 命令总结
官方文档 https://git-scm.com/docs1. 生成并添加ssh keyssh-keygen -t rsa -C "your_name@your_email " -b 4096vi ~/.ssh/id_rsa.pub2. 提交前准备git status //查看 本地 与 git远端的不同git diff one_file // 查看某一个文件 与git的不同git branch //查看 本地 valid的分支git branch -a // /查原创 2020-08-22 19:03:22 · 171 阅读 · 0 评论 -
虚拟机安装教程
常用的虚拟机 有VM Workstation 和VirtualBox。基本的安装方法 度娘有很多。如 VirtualBox虚拟机安装Ubuntu操作系统https://blog.youkuaiyun.com/qq_37189082/article/details/79549209以下只给出一些常见的问题及解决方法。VM Workstation安装VMware Tools显示灰色的办法在虚拟机设置...原创 2020-03-08 20:36:30 · 232 阅读 · 0 评论 -
Makefile基础知识
1. makefile中的几个重要函数1.1 Wildcard 和patsubst$(patsubst pattern,replacement,text),用于替换,函数参数有三个,$(wildcard pattern) 返回已经存在的、使用空格分开的、匹配此模式的所有文件列表一般使用patsubst 和wildcard 函数配合, 得到 .o 文件的文件名。参考https://www.jianshu.com/p/523726ef5c3b,假设当前路径下有三个cpp文件:circle.c原创 2020-07-15 22:03:52 · 221 阅读 · 0 评论 -
编译、汇编、链接过程 和g++编译选项
从 C/C++ 源代码 到 可执行文件 需要经过4个步骤:预处理,由后缀为.c/.cpp的源程序生成后缀为.i的预处理文件,预处理文件本质也是c/cpp源程序,只是进行了头文件展开和宏替换; 编译,由后缀为.i的预处理文件生成后缀为.s的汇编文件,这一步是将源程序转化为汇编指令; 汇编,由后缀为.s的汇编文件生成后缀为.o的机器代码,即二进制文件,但是这时候还不可以执行; 链接,把大量的后缀为.o的机器代码(Object File)合成执行文件,这个动作叫作链接(link)链接:https://原创 2020-07-15 21:56:08 · 2048 阅读 · 0 评论 -
C/C++内嵌汇编
在现代编程中,已经很少能见到纯汇编语言写的程序,但由于C/C+等高级语言在编译时会进行优化等,使得我们不能准确知道一段C代码在CPU上执行时的具体机器码操作,而对于某些特殊场景(如测试)又需要知道准确的指令操作,此时可以在C代码中使用嵌入式汇编。C/C+中的关键字asm,是告诉GCC编译器后面括号内的代码是内嵌汇编。 内嵌式汇编格式: __asm__( " 指令列表" : "输出列表 " : "输入列表 " :"破坏描述部分 "); 注意()里面的三个冒号缺一不可。如果想告...原创 2020-06-08 21:31:01 · 3729 阅读 · 0 评论 -
浮点数在内存中的存储方式
浮点数可以简单理解带小数点的数,像10.0也为浮点数。C/C++中使用的浮点数类型有float 和double (也分别称之为 单精度和双精度浮点数),其中float占4byte,32bit;double占8byte。在AI计算领域,又有FP32、FP16和BF16的数据类型(也称之为 单精度/半精度/混合精度 浮点数),FP32类型同C/C++中的float存储方式一样;从字面意思就可以看出,FP16和BF16类型在内存中占16bit。为了兼容和移植方便,目前的处理器都会遵循IEEE规定...原创 2020-06-07 11:49:56 · 1822 阅读 · 0 评论 -
C/C++ 多线程编程/ 绑定CPU
Pthread是由POSIX提出的一套通用的线程库,在linux平台下,它被广泛的支持,而windows平台下,却并不被支持,而pthreads-w32为我们提供了解决方案 多线程编程需要包含头文件 #include <pthread.h> #include <unistd.h> 中的函数 long sysconf (_SC_NPROCESSORS_ONLN); 可以获取当前CPU的核数。 多线程程序也可以在单核CPU上运行,但同...原创 2020-06-06 22:28:13 · 5336 阅读 · 0 评论