![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++
文章平均质量分 62
字正腔圆
你永远不知道你努力了之后,会是怎样...
展开
-
C++11特性学习
c++11新特性原创 2022-12-14 21:13:19 · 239 阅读 · 0 评论 -
根据PL的GPIO寄存器地址通过mmap控制GPIO
寄存器控制gpio方式原创 2022-07-06 09:57:55 · 196 阅读 · 0 评论 -
-O2时类型转换的惩罚-fstrict-aliasing/-fno-strict-aliasing\-Wstrict-aliasing=2
-O2优化转载 2022-07-05 09:49:09 · 260 阅读 · 0 评论 -
手写blockque
#include <queue>#include <mutex>#include <atomic>#include <condition_variable>#include <iostream>template <typename T>class BlockQue {public: ~BlockQue(){ endBlock(); } void addTask(T data){...原创 2021-09-12 10:02:06 · 87 阅读 · 0 评论 -
内存管理基本原理
因为单次分配内存,并不仅是指定大小,会额外在指定内存前后添加cookie空间(bookspace),这样的操作会导致,高频次申请内存实际消耗内存大于实际使用, 且增加了malloc(new)调用次数和时间消耗。系统支持自定义策略,通过自己维护存池进行内存使用管理,减少malloc或new调用次数,以及cookie空间消耗。如何支持自定义策略,c++支持重载全局的operator new 和类内operator new,具体使用如下例子:#ifndef _mem_tst_h_#define原创 2021-07-03 19:26:30 · 150 阅读 · 0 评论 -
内存空间的连续性(逻辑地址、物理地址)
堆分配的内存空间到底是连续的还是不连续的,如malloc/new分配的内存空间是连续的吗?堆分配的空间在逻辑地址上是连续的,但在物理地址上是不连续的(因为采用了页式内存管理,windows下有段机制、分页机制),如果逻辑地址空间上已经没有一段连续且足够大的空间,则分配内存失败。堆包含一个链表来维护已用和空闲的内存块。不同进程对堆内存申请和销毁是不同步的,这就会导致一段内存区间中,部分段使用中,部分段已经空闲。在堆上新分配(用 new 或者 malloc)内存是从空闲的内存块中找到一些满足要求.转载 2021-07-03 19:16:15 · 4344 阅读 · 0 评论 -
堆、栈的概念及使用特性
堆和栈是一个统称,可以有很多的实现方式。计算机程序通常有一个栈叫做调用栈,用来存储当前函数调用相关的信息(比如:主调函数的地址,局部变量),因为函数调用之后需要返回给主调函数。栈通过扩展和收缩来承载信息。实际上,程序不是由运行时来控制的,它由编程语言、操作系统甚至是系统架构来决定。堆是在任何内存中动态和随机分配的(内存的)统称;也就是无序的。内存通常由操作系统分配,通过应用程序调用 API 接口去实现分配。在管理动态分配内存上会有一些额外的开销,不过这由操作系统来处理。它们的大小由什么决定? 依赖转载 2021-07-03 18:52:54 · 1503 阅读 · 0 评论 -
Program received signal SIGSEGV , Segmentation fault.
pthread_mutex_lockclass CBlue2th : public InnerBlue2th {public: 。。。。protected: ResCache m_resCache; //static或全局变量下可以,成员变量不行 std::set<ENUM_PROTO> m_dumpProtos;};Blue2th* CBlue2th::BT_Test_Config(vector<ENUM_RF_NAME>& .原创 2021-06-29 16:25:44 · 284 阅读 · 0 评论 -
八大设计原则
1. 单一职责原则 Single responsibility principle,SRP2. 接口隔离原则 Interface Segregation Principle,ISP3. 迪米特法则:Law of Demeter,LoD (最少知道原则)接口隔离原则和单一职责都是为了提高类的内聚性、降低它们之间的耦合性,体现了封装的思想单一职责原则注重的是职责,而接口隔离原则注重的是对接口依赖的隔离。迪米特法则还是在讲如何减少耦合的问题,类之间的耦合越弱,越有利于复用,一个处在弱耦合的类被修改,原创 2021-06-23 12:20:31 · 157 阅读 · 0 评论 -
multimap用法总结
multimap在没有指定插入位置时,插入相同key值的value时默认插入在后面;在指定了插入位置的提示符迭代器后(覆盖了默认插入位置)如果插入key和位置key相等则插入在指定位置的前面,否则提示符迭代器不会生效。...原创 2021-06-20 18:18:09 · 876 阅读 · 0 评论 -
c++:从单例到内存屏障
首先我们用c++写一个经典的单例:#include <mutex> class Singleton { public: static Singleton* GetInstance() { if (!instance_) { std::lock_guard<std::mutex> lock(lock_); if ...转载 2021-06-08 16:38:53 · 1493 阅读 · 0 评论 -
udp校验和计算及伪首部
UDP中的伪首部是干什么用得到?UDP首部校验和计算:对于TCP和UDP的数据报,其头部也包含16位的校验和,校验算法与IPv4分组头完全一致,但参与校验的数据不同。这时校验和不仅包含整个TCP/UDP数据报,还覆盖了一个虚头部(伪首部)。校验和计算u_int16_t in_cksum (u_int16_t * addr, int len){ int nleft = len; u_int32_t sum = 0; u_int16_t *w = a...原创 2021-03-31 18:51:46 · 2164 阅读 · 0 评论 -
C++11 锁
互斥 (Mutex: Mutual Exclusion)互斥对象锁(lock\unlock)C++使用RAII进行自动资源管理(管理类模板)加锁策略策略支持情况避免死锁线程间的锁条件锁自旋锁C++11提供了4个互斥对象(C++14提供了1个)用于同步多个线程对共享资源的访问互斥对象类名描述std::mutex最简单的互斥对象。std::timed_mutex带有超时机制的互斥对象,允许等待一段时间或直到某个时间点仍未能获得互斥对象的所有权时放弃等待。std::rec原创 2020-12-20 16:39:06 · 890 阅读 · 1 评论 -
libevent笔记- bufferevent的客户端
....using namespace std;void event_on_write(struct bufferevent *bev, void *arg){ cout<<"-------notic: data send ok"<<endl; //发送成功后回调}void event_on_connect(struct bufferevent *bev, short events, void *arg){ if (events & B.原创 2020-12-13 21:22:31 · 170 阅读 · 0 评论 -
libevent 笔记 -API (2) bufferevent 、读写水位及超时
void socket_eventcb(struct bufferevent *bev, short events, void *user_data){ if (events & BEV_EVENT_EOF) { bufferevent_free(bev); } else if (events & BEV_EVENT_ERROR) { bufferevent_free(bev); } else if(events & BEV_EVENT_TIMEOUT)...原创 2020-12-13 20:25:06 · 976 阅读 · 0 评论 -
笔记: 判断lib库是动态库还是静态库
用vc自带的lib.exe /list xxxx.lib输出如果是.obj的文件怎是静态库,如果输出的是.dll 后缀的文件则说明是动态库原创 2020-12-06 15:51:39 · 487 阅读 · 0 评论 -
libevent笔记 - API
libevent 网络编程需要初始化或者屏蔽的操作#include <event2/event.h>#ifndef _WIN32#include <signal.h>#endifusing namespace std;int main(){#ifdef _WIN32//64 32 WSADATA wsa;//init win socket WSAStartup(MAKEWORD(2,2), &wsa);#else原创 2020-12-06 13:28:12 · 368 阅读 · 0 评论 -
libevent笔记 - 编译依赖
1. zlib 1.2.112. perl 编译openssl的依赖3. nasm编译openssl的依赖4.openssl 1.1.1 //perl Configure VC-WIN32....5. libevent 2.1.8 //ssl cryto原创 2020-12-05 13:33:39 · 437 阅读 · 0 评论 -
CMakeLists.txt 之C++
https://blog.codekissyoung.com/%E5%B8%B8%E7%94%A8%E8%BD%AF%E4%BB%B6/cmake CMake 入门实战 CMake Official Tutorial——教程还是官方的好 cmake 教程 基本语法 一、什么是Cmake CMake是一个跨平台的、开源的安装(编译)工具, 因为它使用和平台、编译器无关的配置文件(较为简单的语句)来描述编译控制,所以他能够输出各种各样的makefile或者pr...翻译 2020-11-15 22:12:56 · 1014 阅读 · 1 评论 -
支持c++11编译add_definitions(-std=c++11)
cmake_minimum_required(VERSION 2.8.8)add_definitions(-std=c++11)if (POLICY CMP0048) cmake_policy(SET CMP0048 NEW)endif (POLICY CMP0048)project(googletest-distribution)set(GOOGLETEST_VERSION 1.10.0)if (CMAKE_VERSION VERSION_GREATER "3.0.2") if(...原创 2020-11-13 17:45:57 · 1859 阅读 · 0 评论 -
2020-10-14 MinGW 相关
MinGW,即 Minimalist GNU For Windows。 为windows设计的极简GUN工具集合。提供了Win 版的 GCC。但是MinGW 允许控制台模式的程序使用微软的标准C运行时(C Runtime)库(MSVCRT.DLL),该库在所有的 NT OS 上有效,在所有的 Windows 95发行版以上的 Windows OS 有效,使用基本运行时,可以使用微软提供的 C 运行时(C Runtime)扩展,与基本运行时相结合,就可以有充分的权利既使用 CRT(C Runtime)又原创 2020-10-14 18:19:32 · 168 阅读 · 0 评论 -
C++ 之 保证基类对象模型在派生类中维持原样性(并扩展描述虚表指针的内存)
简单讲: 意思就是基类对象的内存大小是多少,那么在派生类的对象内存中,基类部分占用内存空间不变。比如,考虑字节对齐的情况,基类补齐的内存空间里面,不可能填充派生类的数据成员。实力验证:#include "stdafx.h"#include <stdio.h>#include <iostream>using namespace std;class CBase{ //virtual void show(){}private: int nData; ...原创 2020-10-13 20:40:33 · 92 阅读 · 0 评论 -
虚表指针vptr在对象的什么位置?vptr指向虚表的哪里?虚函数地址是偏移吗
[fdj@hs-192-168-33-206 virtbl]$ vi main.cpp CTest(int data, int* p); virtual void show(); void print();private: int a; int *ptr;};CTest::CTest(int data, int* p):a(data), ptr(p){}void CTest::show(){ cout<<"in show"<<...原创 2020-10-12 19:40:15 · 510 阅读 · 0 评论 -
关于Cfront
最早的C++代码都是用cfront转成C代码然后用C编译器编译的。。。而且按照C++的设计准则,当你不适用一个特性的时候,相关代码是不会引入编译后的的目标文件中的,比如虚函数和RTTI之类的,所以如果你没有使用这些特性,也不会有性能损失。另外从开发效率上来说,因为C++的类型检查比C更为严格,避免了隐藏的错误(简单来说就是坑少了)。而且还有个STL。。。所以开发上来说,还是C++的效率高一点。另外std::sort完爆qsort~ ^_^作者:李洋链接:https://www.zhihu.co转载 2020-10-09 11:08:53 · 944 阅读 · 0 评论 -
gcc或g++的编译选项 -shared -fPIC 与 -g -rdynamic 部分转载
动态库Linux下动态链接库(shared object file,共享对象文件)的文件后缀为.so,它是一种特殊的目标文件(object file),可以在程序运行时被加载(链接)进来。使用动态链接库的优点是:程序的可执行文件更小,便于程序的模块化以及更新,同时,有效内存的使用效率更高。创建一个动态链接库,可使用 GCC 的-shared选项。输入文件可以是源文件、汇编文件或者目标文件。另外还得结合-fPIC选项。-fPIC 选项作用于编译阶段,告诉编译器产生与位置无关代码(Position-I.转载 2020-09-30 12:08:55 · 6223 阅读 · 0 评论 -
explicit让代码更可读更优美
Class CxString{public: explicit CxString (int size){} explicit CxString(const char* lpStr, int size=100){}};C++中的explicit关键字只能用于修饰只有一个参数的类构函数;或者有多个参数但因为有默认参数,只需要传入一个参数的构造函数。声明构造函数为显式,而非默认的隐式。避免如下的晦涩代码:CxString str=4;//str(4)str=...原创 2020-09-26 22:03:38 · 70 阅读 · 0 评论 -
g++ 编译选项 -m
gcc提供了编译选项可以为指定架构生成汇编代码,These ‘-m’ switches are supported in addition to the above on x86-64 processors in 64-bit environments.-m32 32位版:加上 -m32 参数,生成32位的汇编代码;-m64 g++ -m64 加上 -m64 参数,生成64位的汇编代码;-mx32-m16由于64位机器的寄存器比32位机器多很多,所以GCC编译器会尽量使用寄存...转载 2020-09-12 18:10:44 · 1353 阅读 · 0 评论 -
设计模式回顾
1. 单一职责原则 : 就一个类而言,应该仅有一个引起它变化的原因。—— 直白就就是一个类职责要单一(功能原子性),这样类的职责就是低耦合的,这个类的变化不会影响其他职责的能力。软件设计要做的就是发现职责,并把职责归类,分离。2. 模板方法模式: 基于职责归类、分离,对功能求同存异,把相同的功能点抽离出来放到父类,而不同点个性化的在子类中实现,到达子类复用父类代码的效果。3. 开放封闭原则:简单讲就是对修改封闭,对扩展开放。 从实现中把可能发生变化的抽象出来(大部分以接口的形式),新的需求来了也只需原创 2020-08-29 15:30:46 · 98 阅读 · 0 评论 -
查问题使用率80以上%
ps -eLo pid,lwp,pcpu |grep pid ps -eLo pid,lwp,pcpu | grep 30222 pstack 30222原创 2020-07-21 20:19:01 · 115 阅读 · 0 评论 -
虚函数表及虚函数表指针(看似简单,深入部分也不是很懂)
class Base{ virtual void print(){}};class Base2{ virtual void dprint(){}};class CBase: public Base, public Base2{};//g++ align.cpp -fdump-class-hierarchy-------------------------------------linux 64位系统--------------------------------------...原创 2020-06-13 22:14:41 · 2827 阅读 · 0 评论 -
字节对齐及why
32位系统4字节对齐:因为地址总线的关系,有2根总线不参与寻址,导致只能获取到4的整数倍的地址,所以默认是4字节对齐。64位系统8字节对齐:《TheIntel64andIA-32ArchitecturesSoftwareDeveloper'sManual》为了性能考虑,8字节的数据需要8字节对齐和cpu缓冲命中率有关系There are multiple hardware components that may be adversely affected by unalign...原创 2020-06-13 11:08:20 · 695 阅读 · 0 评论 -
自定义string类
#ifndef _MY_STRING_H__#define _MY_STRING_H__#include <iostream>using namespace std;namespace MyDefine{class MyString{public: MyString(); ~MyString(); MyString(const char* lpStr); MyString(const MyString & another); ...原创 2020-05-24 22:34:30 · 147 阅读 · 0 评论 -
在搞美股,涉及美东不同令时下的时间计算【不太习惯,思考了很久才写出来,惭愧】
//关键是找到指定年月的某个星期天是几号int GetMonthSunday(int index, int date){ if(index <1 || index>4){ return -1; } struct tm tmp_tm ; time_t now = time(NULL) ; struct tm *local = localtime_r(&now, &tmp_tm) ; local->tm_yea...原创 2020-05-16 16:46:25 · 218 阅读 · 0 评论 -
判断是否是数字——IsNumberStr
#include #include using namespace std;bool IsNumbe(string str){ stringstream sin(str); char c; double d; if(!(sin>>d)) { return false; } if(sin>>c)原创 2017-09-04 17:50:51 · 1279 阅读 · 0 评论 -
windows 互斥及临界区test-demo
// testWinLock.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include "LockMutex.h"#include "CriSection.h"#include #include #include using namespace std; //#define ENAB原创 2017-09-14 14:16:40 · 185 阅读 · 0 评论 -
Linux、windows版本线程互斥锁
#ifndef CONFIG_ENV_H#define CONFIG_ENV_H#define LOCK_NAMESPACE LOCK#define NAMESPACE_BEGIN(x) namespace x {#define NAMESPACE_END }#define原创 2017-09-14 18:24:08 · 1022 阅读 · 0 评论 -
linux读写锁
class API_EXPORT CReadWriteLock{public: CReadWriteLock(); ~CReadWriteLock(); ///获得读锁 /** *@return 非零 表示失败,原因需检查系统错误, 0表示成功 */ i原创 2017-09-15 10:50:23 · 615 阅读 · 0 评论 -
C++11 智能指针就是这么回事(很久前)
// test.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <iostream>using namespace std;//---------------------定义------------------------------#define MY_AUTO_PTR MyDefine::AutoPtrnamespace MyDefine{ template <class T> class ...原创 2020-05-10 14:23:40 · 114 阅读 · 0 评论 -
GDB源码移动后如何调试以及几种解决方法
发生core dump之后, 用gdb进行查看core文件的内容, 以定位文件中引发core dump的行. gdb [exec file] [ core file]gdb之所以能够知道对应的源代码,是因为调试版的可执行程序中记录了源代码的位置;因为源代码的位置在编译之后可能会移动到其它地方所以gdb还会在当前目录中查找源代码另外gdb也允许明确指定源代码的搜...原创 2020-03-07 16:20:53 · 452 阅读 · 0 评论 -
GDB常用命令总结
常用命令(From:http://my.donews.com/tangfl/2006/10/23/gdb-debug-example/) break NUM 在指定的行上设置断点。 bt 显示所有的调用栈帧。该命令可用来显示函数的调用顺序。 clear 删除设置在特定源文件、特定行上的断点。其用法为clear FILENAME:NUM continue 继续执行正在调试的程...转载 2020-03-07 16:14:17 · 1275 阅读 · 0 评论