
C++
文章平均质量分 56
好吧我随便改的
抓住最后的机会~
展开
-
首次使用ninja的体验
首先编写CMakeLists.txt,然后cmake -G Ninja生成build.ninja,最后ninja all对该build文件进行编译,生成二进制成果物。首先总结说自己的理解,就是NINJA是一个和MAKE同一级别的编译工具,在CMAKE/GRADLE等工具之下工作。cmake目前可以生成makefile,也可以生成ninja文件(CMAKE选项中增加了-G Ninja)当然也可以直接编写build.ninja文件然后ninja all来编译工程。ninja:源码安装。原创 2023-08-14 18:02:46 · 403 阅读 · 0 评论 -
OPENGL知识点整理(一)
概述内容为阅读相关博主文档后整理,因此,相当部分的内容直接引用自如下链接:https://www.jianshu.com/p/5da5a17ad5cbhttps://blog.csdn.net/u012861978/article/details/97833643在opengl中,根据处理的先后次序来分,主要有如下几个坐标系:就是以要被渲染物体的重心作为坐标体系,可以标识出该物体的各个定点的坐标(个人理解)不同的物体都有其自己的物体坐标系惯性坐标系原点域物体的物理坐标系相同,但是其x,y,z轴与世界转载 2022-11-16 22:55:56 · 486 阅读 · 0 评论 -
c++ backtrace
今天在看apollo代码时,看到了C++中打印backtrace的方法:// 打印堆栈信息void ShowStack() { int i; void *buffer[STACK_BUF_LEN]; int n = backtrace(buffer, STACK_BUF_LEN); char **symbols = backtrace_symbols(buffer, n); AINFO << "=============call stack begin:=====转载 2023-02-24 17:15:41 · 342 阅读 · 0 评论 -
C++ tuple模板类使用体验
C++ tuple模板类使用体验make_tuplegettietuple类可以说是一种特殊的pair类型,其内部可以最大包含10个左右不同类型的成员(pair只能包含两个)使用tuple需要包含头文件对应std::make_pair,tuple也有对应的std::make_tuple模板函数用于创建特定类型的tuple对象tuple主要有如下常用的操作make_tuplemake_tuple用于创建一个指定类型的tuple对象,例如std::make_tuple<int, float,原创 2022-03-27 12:53:06 · 5578 阅读 · 0 评论 -
内存对齐的理解
1.编译器默认的内存对齐规则默认的对齐规则是一个变量的地址需要是其类型的长度的整数倍:例如下面这个结构体:struct A{char m1;short m2;int m3;}对于A变量的m1成员,其大小为1个字节,起始地址为0,可以满足整除的要求对于A变量的m2成员,其大小为2个字节,因此起始地址1不满足被2整除,需要按照2字节对齐,因此,其起始地址为2,占用2,3两个字节对于A变量的m3成员,其大小为4个字节,因此其起始地址4满足整除4这个要求最终该结构的内原创 2021-12-26 13:47:59 · 474 阅读 · 0 评论 -
eProsima Fast DDS Documentation翻译
#########翻译 2021-11-22 19:18:18 · 998 阅读 · 0 评论 -
阿里巴巴Java开发手册 阅读总结(针对C++开发进行了精简)
命名规则:1.不用特殊符号(¥,$,_等)开头或者结尾(无论对于函数名,类名还是变量名)2.使用大写驼峰对应函数名和类名3.使用小写驼峰对应变量名4.使用全大写对应常量名,单词间用下划线(_)连接5.抽象类类名使用Base或者Abstract开头6.测试类类名使用Test作为结尾7.数组的中括号紧接着类型后面8.包名/命名空间名称使用小写9.使用完整英文单词解析名称用途,不适用中文,中文拼音或者不完整英文单词来命名10.如果类或者方法对应使用了某种设计模式,那么类名/方法名中最好体现该设原创 2021-10-24 17:58:39 · 649 阅读 · 0 评论 -
protobuf 2.0版本排查必填字段未填的方法
在proto2.0版本中,如果required字段没有填写,那么proto编码字符串发给对方进行parse时,对方会parse失败,因此有必要在发送前检查一下是否存在这种情况(特别是在debug阶段)1.为了获取proto序列化的错误信息,首先不能使用MESSAGE_LITE形式的proto,即不要在proto的开头申明 option optimize_for = LITE_RUNTIME;2.在proto对象调用SerializeToString之前,通过IsInitialized方法判断是否该p原创 2021-10-18 15:14:37 · 701 阅读 · 0 评论 -
recv()函数中MSG_PEEK参数的解释(转)
recv默认最后一个flag参数是0,调用完recv,如果socket的接收缓冲区存在数据,则recv调用会从缓冲区中取走数据但是如果flag参数设置为0,则调用完recv,不从接收缓冲区中移除读取的数据。recv()函数中MSG_PEEK参数的解释_sinat_37372543的博客-CSDN博客...转载 2021-10-17 15:21:51 · 737 阅读 · 0 评论 -
调查线程死锁/阻塞的一种方法
最近在使用冰羚中间件的时候,发现应用中的订阅者线程从冰羚获取到订阅数据后,经常随机出现阻塞的问题(应该没有死锁,因为只在该线程中访问冰羚订阅数据)现象就是线程的while循环直接停了,并且排除到是sleep的原因(因为日志显示阻塞的时候还没有运行到sleep),由于时间紧迫,为了尽快解决问题,想到从线程栈来排查问题,问题就在于如何在阻塞时查看线程栈,搜索后发现通过给进程发送abort信号,可以产生核心转储文件或者说是墓碑,里面有各个线程的调用栈,经过操作后获取到coredump文件,根据订阅线程所用的函原创 2021-08-28 16:44:57 · 258 阅读 · 0 评论 -
libcurl使用记录
1.curl_easy_init 返回easy_handle对象(一个CURL*指针)2.curl_easy_setopt 设置行为 2.1 CURLOPT_URL 设置访问URL 2.2 CURLOPT_HEADERFUNCTION 设置获取到RESPONSE HEADER数据时的回调函数,主要通过curl_easy_getinfo解析其中的应答码,头大小等信息 2.3 CURLOPT_WRITEFUNCTION 设置接收到数据时的回调函数 回调函数原型为:size...原创 2021-07-29 06:51:17 · 336 阅读 · 0 评论 -
冰羚-IceOryx FAQ翻译
iceoryx FAQ这份文档中包含的是一些知识点和文档的链接,用于帮助排查RouDi的问题。偶尔我们也会有一些拓展。Available memory is insufficient(可用内存不足)如果你从RouDi的日志或者输出中看到Available memory is insufficient(可用内存不足),那么这哥时候,RouDi就无法预订共享内存给到发布者了。为了避免这种情况发生,你需要检查一下你的主机环境到底支持多大的共享内存,例如在Ubuntu系统上,你可以用下面的命令来检查:df翻译 2021-05-17 10:59:03 · 814 阅读 · 0 评论 -
冰羚-README.md翻译
iceoryx(冰羚) - 一个建立在POSIX系统上的IPC中间件介绍很高兴您已经接触到了IceOryx这个Eclipse项目,让我们快速了解一下背景,介绍这个项目的范围并且通过一些例子带你入门首先,什么是IceOryx(冰羚)?IceOryx是一个在 POSIX 系统上跨进程通信的的中间件,通过POXIS系统上共享内存的特性来完成一个真正的零拷贝数据传输机制。更多的信息可以在 1000 words iceoryx introduction in the eclipse newslet翻译 2021-05-16 21:26:19 · 2526 阅读 · 1 评论 -
冰羚 example-icedelivery-README.md翻译
icedelivery - 在Posix应用间传输数据介绍这个例子展示了基于冰羚系统的进程间通信(IPC),零拷贝完成数据单向传输的例子它提供了发布者和订阅者应用,这些应用包含了两种风格(Bare-metal版本 以及simplified版本)RouDi, 守护进程RouDi是 Routing and Discovery的别名,这个名称很好的描述了RouDi的任务内容。RouDi负责建立通信,但是不实际参与发布者和订阅者间的通信,可以将RouDi想象为冰羚系统中的交换机。RouDi所负责的另一个翻译 2021-05-15 10:34:34 · 833 阅读 · 0 评论 -
冰羚Planned features.md翻译
计划的特性下面这个列表包含了较高级别的冰羚系统的特性,这些特性将很可能在下一个版本实现Windows和Mac系统平台运行的支持RouDi以及posh runtime的使用手册请求-响应的通信模式同一个主题支持多个发布者范围外的特性下面这些特性不是冰羚系统主要关注的,但是,如果你有想法并且希望他们出现在特性清单上,可以针对这个特性提出请求来讨论是否需要增加。让冰羚系统运行在单片机上...翻译 2021-05-14 16:32:43 · 249 阅读 · 0 评论 -
冰羚中间件 conceptual-guide.md翻译
ContentsIceOryx冰羚系统的结构共享内存管理交互机制IceOryx冰羚系统的结构冰羚的组成如下:一个RouDi守护进程多个加载了"Posh Runtime"运行时的进程RouDi守护进程RouDi 的名称由来是’‘Rou’‘ting 和’‘Di’'scovery,其是冰羚系统的核心,并且负责如下功能:Service discovery(服务发现):RouDi是Publisher(发布者)和Subscriber(订阅者)的中心节点Shared memory man翻译 2021-05-03 17:31:51 · 1635 阅读 · 0 评论 -
冰羚中间件 RouDi usage-guide.md翻译
内容内容配置RouDiConfiguring RouDiRouDi可以支持读取从一个配置文件中读取mempool config。如果需要支持这个特性,CMake的编译选项中需要使用 -DTOML_CONFIG=onmempool config配置文件需要以-c命令选项的方式传给RouDi,像下面这样:./RouDi -c /absolute/path/to/config/file.tomlRouDi支持不同的共享内存段使用不同的访问属性用于限制不同应用对于共享内存段的存取。下面是格式版翻译 2021-05-03 00:23:03 · 1145 阅读 · 0 评论 -
exit,abort,_exit的区别
1.exitexit调用会让当前进程调用退出处理函数,并且清空IO缓存,然后调用_exit()2._exit调用exit系统调用,终止程序运行,清空进程使用的内存空间,以及在内核中的数据结构3.abortC 库函数void abort(void)中止程序执行,直接从调用的地方跳出。#include <stdio.h>#include <stdlib.h>int main (){ FILE *fp; printf("准备打开 n..转载 2020-11-28 22:16:45 · 393 阅读 · 0 评论 -
Android进程间文件描述符传递原理-初
Android进程间文件描述符传递原理-初1.进程表2.进程控制块状态存储文件3.文件描述符4.进程间共享文件描述符a.binder驱动将调用进程传入的文件描述符使用fget内核函数后去file对象b.binder驱动在被调用进程中创建新的文件描述符与该file对象关联c.binder修改调用进程传入的文件描述符,改为该被调用进程中创建的新的文件描述符1.进程表操作系统为了了一张表格,即进程表,每个进程占用一个表格项。2.进程控制块每个进程在进程表中占有的表格项目被称为进程控制块,进程控制块中的内容原创 2020-11-28 21:56:38 · 486 阅读 · 0 评论 -
C++链接器弱名称重复时链接的隐患
对于多个CPP中存在相同弱名称的情况下,g++链接的时候是不会提示错误的。另外,如果一个CPP中存在强名称a,另一个CPP中存在弱名称a,则弱名称a在链接时会引用到强名称a的地址。只有当两个CPP中都存在强名称a都时候,链接才会出错。针对第二条,这个规则会引发一个比较严重的隐患。例如A.cpp#include "b.cpp"int a = 10;int b=原创 2017-08-13 11:40:14 · 353 阅读 · 0 评论 -
C++一定要为类提供拷贝构造函数的情况
在C++类中存在成员指针并且在类中为该指针动态申请内存,且该类的对象可能作为函数的形参时,是一定要提供拷贝构造函数的,防止前拷贝直接将该指针拷贝走// test.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include #include class A{private: char* szBuf;public: A原创 2015-02-23 20:32:42 · 1003 阅读 · 0 评论 -
C++编译器自动生成拷贝构造函数的情况
编译器在下面几种情况下会给程序员没有提供拷贝构造函数的类自动生成拷贝构造函数1.类中有虚函数当这个类中有虚函数的时候,意味着这个类的对象中一定包含了指向其虚函数表的指针试想,如果讲该类的派生类的对象作为该类的初始化对象,即B继承Aclass A{private: int m_a;public: virtual void ShowVal();}...转载 2018-12-03 11:04:24 · 1512 阅读 · 0 评论 -
C++等号操作符重载错误
今天在帮同事看一段代码时发现这么一个问题,虽然不大,但是困惑了不少时间,知道在CSDN论坛上找到答案,特此记录下来大家都知道,C++支持操作符重载,操作符重载可以有两种实现方式:成员函数和全局函数但是,我今天碰到的问题就是,我实现了一个等号操作符用来操作自定义类,编译的时候,提示void operator=(const A& ,const A&) must be a nonstat...转载 2018-03-14 15:48:00 · 3273 阅读 · 1 评论 -
C++不允许在函数的try中使用static局部变量的原因
在《INSIDE C++ MODEL》书中247页提到了如下一段话:“shiyon给被静态初始化的objects,有一些缺点。例如,如果exceptiony handling被支持,那些objects将不能够被放置于Atry区段之内...."想了一段时间才想明白这个问题,下面用一段代码来说明一下:A.cppclass A{}int main(){原创 2017-06-02 15:43:27 · 746 阅读 · 0 评论 -
C++对于表达式临时对象的处理
在表达式中如果使用了一个类的操作符重载函数,或者调用了一个返回类对象的函数,都会产生临时对象。临时对象的生存周期就在表达式中(甚至是表达式中的子语句),临时对象的销毁应该是在完整表达式的最后一句执行。比如下面的例子T c;c = a + b;另外,对+操作符有操作符重载T operator+(const T& a, const T& b);其中a+b会产生一个临时变量,转载 2015-05-10 22:31:55 · 780 阅读 · 0 评论 -
C++构造函数中不调用虚函数的原因
今天在看网上一篇帖子的时候看到这个问题,试讲关于C++对象虚函数表和类型信息的(RTTI)的,正好看到了如下内容:这个是为什么在构造函数中不能调用虚函数的原因 .因为任何时候在基类中的虚函数调用,都不可能到达子类的实现,因为子类的虚表初始化是在调用完基类的构造之后发生的. 因此在基类中调用虚函数永远只能调用到自己的实现或者更基类的实现,不可能跳转到子类的实现.也就是说,如果你本类的构造转载 2015-05-02 12:27:56 · 1110 阅读 · 0 评论 -
C++虚拟机制的压制
C++中,如果一个类有虚拟函数的时候,当使用该类的指针调用其虚函数的时候,代码会被编译器转换为使用虚函数表中保存的函数地址找到函数后二次调用,即:class A{public: virtual void Out(){this->Inner();}; virtual void Inner(){};} int main(){ A* pA原创 2015-04-15 17:12:22 · 617 阅读 · 0 评论 -
C++编译器为类自动生成拷贝构造函数的情况
在一下情况中C++会为类自动生成拷贝构造函数1.类中有虚函数这种情况即意味着类的对象中有指向虚函数表的指针。考虑下面的情况class A{private: int m_a;public: virtual void ShowVal();}void A::ShowVal(){ printf("%d", m_a);}原创 2015-03-08 12:54:42 · 2521 阅读 · 0 评论 -
编译器自动生成默认构造函数的情况
在程序员没有为类定义默认构造函数的情况下,C++编译器在某些情况下会自动生成默认构造函数。1.类中包含的其他有默认构造函数的类的对象例如:Class A{private: int data;public: A();};A::A(){ this->data = 10;} Class B{private:原创 2015-02-23 20:11:09 · 2060 阅读 · 0 评论 -
CB使用TINYXML类库进行XML操作
由于看到网上对C++下的xml类库中tinyxml的评价比较好,因此,在最近的一个项目里上手使用了一下,发现该类对XML操作的封装的确不错。首先贴上要操作的XML内容1当result节点为0时,该节点为错误消息,否则为空2 Report\2015001011\2015001011-张三-11002.pdfReport\2015001011\2015001011-张三-1原创 2015-02-01 14:59:42 · 664 阅读 · 0 评论 -
C++线程本地存储
今天无意看到一篇帖子介绍这个概念,链接如下:http://blog.163.com/result_2205/blog/static/1398194502010235225571/转载 2014-10-04 21:03:34 · 1683 阅读 · 0 评论 -
ActiveX控件中加载BCB编写的dll的注意事项
最近写了一个ActiveX控件,使用MFC,控件中添加方法,其中调用BCB编写的一个dll进行duk原创 2014-06-10 21:15:14 · 1215 阅读 · 0 评论 -
C++全局对象的初始化和析构
众所周知,一个应用程序的开始是从main函数开始,到MAIN函数结束。那么对于下面的程序1.cppclass A{public: A(); ~A();}A g_a;int main(){return 0;}2.cppA g_a1;全局对象g_a的初始化是谁去做的,以及他的析构又是有谁执行的。答案是编译器。转载 2015-05-03 17:48:09 · 3820 阅读 · 1 评论 -
C++处理函数局部静态类对象的构造和析构
《NSIDE C++ MODEL》书中第六章关于局部静态对象有这么个例子const Matrix&identity(){ static Matrix mat_identity; //.... return mat_identity;}局部静态对象mat_identity的构造和析构都只能执行一次,但是函数可能会被进入多次,C++编译器如何处理这个函数局部静态变量的原创 2015-05-04 21:23:01 · 1826 阅读 · 0 评论 -
代表类成员函数类型的函数指针类型
以前一直以为函数指针类型就是只有这种样式的,即void (*PFUN_SAVE)(void*);那么PFUN_SAVE就是可以表示void fun(void*param),void get(void*param)这种实际的函数,PFUN_SAVE pFn = &(fun),pFn = &(get);但是,对于类成员函数,由于编译器在编译时会将函数的参数默认加上this参数,同时将其改为转载 2018-01-24 14:59:20 · 317 阅读 · 0 评论 -
对带缓存区的标准IO的理解
最近在看CSAPP上的系统级IO这一张,在看了RIO以及网上一些大神的博客之后,稍微有些心得,在此记录下来。首先,系统本上是提供了内核级别的IO操作,这些IO操作虽然普遍被归为无缓冲的IO接口,但是这个缓冲是指在用户层是否有缓冲,内核提供的IO接口函数是在内核中有操作缓冲的。例如,内核中提供了100个字节的缓存,但是如果每次我们调用IO的write只写入10个字节,那么要等10次循环将内核原创 2017-09-30 17:21:29 · 779 阅读 · 0 评论 -
一个简单的MAKEFILE示例
最近在自己编写自己的测试项目时觉得每次都是用G++命令去编译自己的项目还是有点麻烦,也是时候去学一学Makefile的写法了。因此,针对自己的测试项目的特点(不太使用外部链接库),写了一个较为简单的MAKEFILE,也学到了不少makefile中的知识点#目标文件名TARGET_NAME=protectedFile#目标文件类型(可执行,静态库,动态库)TARGET_PREF...原创 2017-08-31 18:03:46 · 350 阅读 · 0 评论 -
nohup command 2>&1 &的解释
nohup的作用是让命令永久执行,哪怕当前终端已经退出登录而&的作用是后台执行因此nohup command &的意思是永久执行command,并且是在后台执行至于2>&1的作用在bash shell中0代表标准输入,一般是键盘录入1代表标准输出,一般是屏幕2代表标准错误因此当命令使用nohup &运行以后标准都错误都输出到2去了,console上看不到原创 2017-09-13 19:33:37 · 979 阅读 · 0 评论 -
linux下创建用户线程和内核线程
在linux下,线程都是通过pthread_create创建的。线程分为用户线程和内核线程,在windows下,用户线程大都是通过线程库提供的,用户线程依附在内核线程上,一般是一个和多个用户线程对应一个内核线程,内核线程通过线程库完成用户线程的切换。在linux下,内核线程和用户线程是在创建线程时通过属性参数进行区分的,如下:#include #include #include转载 2017-07-05 16:23:35 · 2581 阅读 · 0 评论 -
C++全局对象初始化依赖关系处理
class A{private: int m_nSize;public: A() { m_nSize = 100;m_pList = new char[4]; memset(m_pList, 0,sizeof(4*sizeof(char))); } int GetSize() {转载 2017-06-22 23:09:30 · 972 阅读 · 0 评论