C++
聆听--风雨
这个作者很懒,什么都没留下…
展开
-
C++ 使用Python/C API的Hello World示例
通过Python/C API可以用C/C++或者其他语言(比如rust、go)来编写Python的扩展。很多机器学习的Python库底层其实都是用C/C++实现的。其他语言也可以通过Python/C API来调用Python的模块,总之Python/C API就是一座Python与其他语言之间的桥梁。本文通过一个简单的例子介绍如何在C/C++中调用Python。原创 2022-04-20 20:17:53 · 2331 阅读 · 0 评论 -
valgrind massif vgdb 排查内存泄露问题(适用于大工程)
前言Valgrind中的memcheck工具也能排查内存泄露,但是主要是用于排查分配与释放不匹配,少释放或多释放等问题。但是如果一个模块不断的申请内存,但是从来没释放造成的内存堆积,用memcheck就检测不出来了。此时需要使用massif。massif的基础原理是隔一段时间拍一个内存快照,通过对比不同快照间的差距,分析出那些模块内存在不断上涨。代码量大(百万行)时,使用massif产生快照文件会用很长时间。所以本文使用massif +vgdb的方式来排查。使用方法运行massif原创 2022-03-02 19:02:54 · 884 阅读 · 0 评论 -
Linux下编译链接动态库符号问题
一般大型的项目会有许多个动态库、静态库。许多个库可能会有符号冲突的问题,如果不对符号进行管理,会引发各种意想不到的问题。原创 2022-01-01 09:45:00 · 1236 阅读 · 0 评论 -
gdb 调试无符号程序 反汇编查看入参
在调试C/C++程序时,如果所调试的程序时无符号的,此时可以通过反汇编来进行调试。原创 2021-12-25 10:00:00 · 1689 阅读 · 2 评论 -
gdb 定位死锁问题
gdb 定位死锁问题转载 2021-12-20 20:14:51 · 415 阅读 · 0 评论 -
C++使用boost::filesystem和statfs遍历Linux根目录并获取磁盘空间
boost::filesystem可以进行跨平台的文件操作,Linux下statfs可以获取挂载点的文件系统信息(Windows下要用windows的API)。原创 2021-11-27 09:45:00 · 1215 阅读 · 0 评论 -
C++ STL内存分配和释放图解
参考资料:[1]STL学习——STL中的内存池管理技术_千里之行,始于足下-CSDN博客_stl内存管理[2]《STL源码剖析》候捷理解不到位的地方请各位读者斧正原创 2021-11-14 18:17:03 · 1081 阅读 · 0 评论 -
C++实现一个简单的模板元编程实例
本文实现一个简单的模板元编程示例。原理是通过C++模板,在编译阶段计算程序的结果。这样听上去比较高大上,实际上很少应用。HelloWorld.h代码如下:#pragma oncetemplate <unsigned n>struct Factorial{ enum { value = n*Factorial<n - 1>::value };};template<>struct Factorial<0>{ enum原创 2021-10-05 14:17:21 · 520 阅读 · 0 评论 -
C++使用windowsAPI获取本地网卡信息
可以获取到本地网卡的mac、IPV4地址、IPV6地址等各种信息。也可获取到有线网卡、环回网卡、隧道网、无线网卡等不同类型的网络信息。代码如下:#include <winsock2.h>#include <WS2tcpip.h>#include <iphlpapi.h>#include <stdio.h>#include <stdlib.h>#include <atlconv.h>#include <iostre原创 2021-09-11 10:11:51 · 2492 阅读 · 0 评论 -
C++中函数指针、lamada表达式、bind间的效率对比
由于工作需要,写了一个Demo来测试C++中原始的函数指针、lamada、bind之间的性能。代码如下:#include <iostream>#include <chrono>#include <functional>auto res = 0;long test_func(long i){ return i;}auto test_lambda = [](int i){ test_func(i);};auto test_bind =原创 2021-09-25 14:58:14 · 1164 阅读 · 2 评论 -
C++ 获取exe或dll的数字签名
现在许多应用都是有数字签名的。公司发布的程序一般也都需要签完名之后方可发布。比如:本文实现一个C++程序,用于获取指定文件的数字签名信息。运行结果如下:代码如下:#include <windows.h>#include <wincrypt.h>#include <wintrust.h>#include <stdio.h>#include <tchar.h>#pragma comment(lib, "原创 2021-09-19 15:21:20 · 3829 阅读 · 5 评论 -
C++下时间计算
本段代码实现1、本地时间,UTC时间之间的换算2、日期的加减计算,比如计算30天前的时间3、std稳定时钟、时间段的使用#include <iostream>#include <vector>#include <functional>#include <memory>#include <future>#include <string>#include <unordered_set>#inclu原创 2021-09-04 11:15:43 · 1106 阅读 · 0 评论 -
C++使用Boost.coroutine2实现协程
#include <iostream>#include <boost/coroutine2/all.hpp>#if 0void foo(boost::coroutines2::asymmetric_coroutine<void>::push_type & father){ std::cout << "1"; father();...原创 2021-09-02 19:41:28 · 370 阅读 · 0 评论 -
libcapn1.0.0编译(Windows下,vs2015编译)
libcapn是用于Apple推送通知服务(APNs)的一个库,用于向苹果手机推送消息。原创 2021-07-08 19:21:30 · 121 阅读 · 0 评论 -
深入理解C++的new合delete
https://blog.csdn.net/nishisiyuetian/article/details/81702180转载 2021-02-01 19:49:48 · 189 阅读 · 0 评论 -
C++对象模型详解
https://www.cnblogs.com/tgycoder/p/5426628.html这里写的很清楚,转载一波转载 2020-09-14 19:13:23 · 166 阅读 · 0 评论 -
C++最简单的日期计算
开发过程中有时候需要进行有关日期的计算,比如计算3个月前的日期,计算60天后的日期,计算两年前的日期等。自己算起来非常麻烦,难免有疏漏。利用tm结构体和time_t,可以轻松地准确地计算这些日期。程序如下:#include <iostream>#include <time.h>void PrintTime(tm tmp_time){ printf("%04d_%02d_%02d\n", tmp_time.tm_year + 1900, tmp_time.tm_m原创 2020-07-02 10:53:33 · 2611 阅读 · 0 评论 -
C/C++知识回顾 队列的出队和入队
#includeusing namespace std;typedef struct student{ int data; struct student *next;}node;typedef struct linkqueue{ node *first, *rear;}queue;//入队queue * push(queue * Q, int num){ node *s原创 2017-03-06 21:53:16 · 4807 阅读 · 0 评论 -
《Effective Modern C++》读书笔记暨C++11、C++14特性记录
C++新特性1、Lambda表达式:https://www.cnblogs.com/DswCnblog/p/5629165.html2、深入理解C++中的mutable关键字3、volatile:C/C++中volatile关键字详解4、c++中的左值与右值5、std::thread6、enable_form_this绪论1、C++11标准中,std::auto_p...原创 2018-10-25 21:04:33 · 1809 阅读 · 0 评论 -
Linux开发笔记暨Linux常用代码
最近公司项目需要把原本windows的代码搞成可跨平台的,过程中遇到一些跨平台方面的细节,记录在这里。 1、Linux端口检测检测端口是否被占用,这个在windows平台下一般用GetTcpTable系统API来实现。而在Linux下没有直接的API,在网上看看了最终提出一个解决方案,就是通过调用bind来判断端口是否被占用。如果有其他更好的解决方案麻烦告知一下。#include...原创 2018-12-04 15:13:13 · 366 阅读 · 0 评论 -
Linux下通过pid文件来实现进程同步、程序的单例
pid文件就记录了程序的进程id,一般程序不会创建,但是在某些情况下,如果想要实现进程间的同步,就会用到pid,比如,想要实现系统中同时只能运行一个程序,即不允许多开。比如手机微信、QQ、等,都是不允许多开的。 实现代码如下:#include <iostream>#include <unistd.h>#include <fcntl.h>#...原创 2018-12-04 15:18:27 · 788 阅读 · 0 评论 -
Windows API总结记录
最近工作总是遇到Windows API调用的老代码,这篇文章用来记录一下。1、与服务相关的一些Windows API#include <Pdh.h>#pragma comment(lib, "Pdh.lib")#include <Psapi.h>#pragma comment(lib, "Psapi.lib")#include <iostream&...原创 2018-12-03 11:51:11 · 494 阅读 · 0 评论 -
《UNIX环境高级编程》阅读笔记
这本书后续需要再读一遍第一章 UNIX基础知识1、文件描述符通常是一个小的非负整数,内核用以标识一个特定进程正在访问的文件。2、open、read、write、lseek以及close提供了不带缓冲的IO。标准I/O函数为那些不带缓冲的I/O函数提供了一个带缓冲的接口。3、程序是一个存储在磁盘上某个目录的可执行文件,内核使用exec函数将程序读入 内存,并执行程序。进程是程序的一个...原创 2018-12-05 17:32:11 · 1745 阅读 · 0 评论 -
C++11 智能指针使用以及实现原理总结
前言-在现代C++编程中应该尽量避免使用裸指针,裸指针很容易带来诸如内存泄露、内存越界、未定义行为等难以察觉的错误。 C++11中共有4种智能指针:std::auto_ptr、std::unique_ptr、std::shared_ptr和std::weak_ptr。所有这些智能指针都是为管理动态分配对象的生命期而设计的,通过保证这样的对象在适当的时机以适当的方式析构来防止资源泄...原创 2019-10-30 14:18:00 · 1829 阅读 · 0 评论 -
C++ Lambda表达式使用总结
一、lambda表达式的基本格式[capture list] (params list) mutable exception-> return type { function body }各字段含义如下capture list :捕获外部变量列表 params list :形参列表 mutable :表示能不能修改捕获的变量 exception :异常设定 return...原创 2019-04-13 11:59:48 · 1747 阅读 · 0 评论 -
代码是如何被运行的——链接、装载与库
代码是如何被运行的——链接、装载与库前言 最近在读业界盛传的《程序员的自我修养》,这本书从普通C/C++程序代码如何被编译成目标文件及程序在目标文件中如何存储一直讲到静态链接、动态链接等,最后讲解运行库、Glibc的实现分析。 虽然书名听上去简单,但需要强调的是,这绝不是一本适合入门级的程序员读的书。全书总体来讲,细而全,涉及到的知识有编译原理、操作系统、线程、进程、内核编程等知识,如果...原创 2019-06-24 21:11:29 · 589 阅读 · 0 评论 -
C++ 使用boost实现http客户端——同步、异步、协程
#include <boost/beast/core.hpp>#include <boost/beast/http.hpp>#include <boost/beast/version.hpp>#include <boost/asio/connect.hpp>#include <boost/asio/ip/tcp.hpp>#inc...原创 2019-08-02 16:49:19 · 11649 阅读 · 0 评论 -
C++ 使用Boost.asio库实现HTTP服务端,讲解、并附带VS2015工程可直接编译运行
前言 最近学习Boost.aiso库,把官网的HTTP 服务端的例子给实现了一下。 官网链接:https://www.boost.org/doc/libs/1_67_0/doc/html/boost_asio/examples/cpp11_examples.html 笔者建了一个VS工程,并把相关的头文件和依赖库给整合了进去,下载下来之后可以直接在Release X64下编译执行。 ...原创 2019-07-30 20:12:08 · 8061 阅读 · 89 评论 -
C++ 使用Boost库计算MD5值
代码如下:#include <boost/algorithm/hex.hpp>#include <boost/uuid/detail/md5.hpp>bool GetMd5(std::string &str_md5, const char * const buffer, size_t buffer_size) { if (buffer == nu...原创 2019-07-26 11:36:08 · 6660 阅读 · 0 评论 -
Linux下解决父子进程端口冲突的两种方法——解决端口继承问题
Linux下解决父子进程端口冲突的两种方法案例背景 在项目实践过程中经常会遇到需要A服务(进程)拉起B服务(进程)的场景,此时B进程作为A进程的子进程会继承A进程的一些资源、比如socket句柄、文件描述符等。如果在这之后,A进程退出,B进程依然会占有之前从A进程继承到的资源。此时如果A进程退出之后再启动,可能就会因为资源被占用而产生问题。问题实例为了演示上述问题,首先,我们作为子进程......原创 2019-08-20 10:35:03 · 2313 阅读 · 0 评论 -
观察者模式解析——C++实现
#include<iostream>#include <algorithm>#include <string>#include <list>#include <memory>using namespace std;enum class Position{ CPP, JAVA, PHP, C_Sharp, Py...原创 2019-08-20 11:34:35 · 519 阅读 · 0 评论 -
C++结构体反射示例
#include<iostream>#include <algorithm>#include <string>#include <list>#include <memory>#include <map>#include <vector>using namespace std;struct Go...原创 2019-09-03 15:48:14 · 810 阅读 · 0 评论 -
《C++并发编程实战》阅读笔记
第 2 章 管理线程2.2 传递参数给线程函数#include<iostream>#include <algorithm>#include <string>#include <list>#include <memory>#include <map>#include <vector>#include...原创 2019-09-11 19:29:51 · 512 阅读 · 0 评论 -
Boost asio入门学习笔记
Timer1:使用一个同步计时器#include <iostream>#include "boost/asio.hpp"int main(){ boost::asio::io_context io; boost::asio::steady_timer t(io, boost::asio::chrono::seconds(5)); t.wait(); std::c...原创 2018-10-10 14:39:11 · 3444 阅读 · 0 评论 -
《Effective C++》读书笔记
一、让自己习惯C++1、视C++为一个语言联邦1、对内置对象类型而言,pass_by_value比pass_by_reference更高效。对用户自定义对象类型而言,pass-by-reference-to-const往往更好。2、尽量以const、enum、inline替换#define3、尽可能使用const1、如果const出现在星号左边,表示被指物是常量,如果const...原创 2018-09-11 10:50:14 · 1213 阅读 · 0 评论 -
Linux下C++ 性能测试工具GPROF()入门教程
一、前言参考GPROF用户数手册:http://sourceware.org/binutils/docs-2.17/gprof/index.html参考博客:http://blog.csdn.net/stanjiang2010/article/details/5655143GPROF是GCC自带的性能测试工具,可以统计出各个函数的调用次数、时间、以及函数调用图。二、教程使用GR...原创 2017-07-10 12:24:35 · 16085 阅读 · 7 评论 -
字符串相关操作 拷贝,循环移动
1.char的整数取值范围为-129-127unsigned char的整数取值范围为0-2552. int const n = 10, a[n] = {0}; const int m = 1; int b[m]; //上面的操作是被允许的3.#include#include#includeusing namespace std;char * strcp(ch原创 2017-03-11 19:32:29 · 1069 阅读 · 0 评论 -
字符串与整数之间的互换
#include#includeusing namespace std;void int2string(int number,char *string2)//把数字变成字符串{ char string[100]; int i = 0; int j = 0; bool is_ = false; //是不是负数 while (i<100) //初始化 { string2[原创 2017-03-11 18:54:33 · 893 阅读 · 0 评论 -
磁带最优存储问题
#include#include#include#includeusing namespace std;ifstream in("input.txt");ofstream out("output.txt");struct Point{ int a; int b; long time() { return a*b; }};bool camp(Point p1,原创 2017-03-07 18:51:06 · 1783 阅读 · 0 评论 -
C/C++ 知识点回顾 字符串转换ASCII码、十进制数转换二进制数
#include#include#includeusing namespace std;//整数转换为二进制数void int2binary(int n){ int a = n % 2; n = n >> 1; if (n==0) { } else { int2binary(n); } cout << a;}//字符串转换为ASCII码int *原创 2017-03-07 18:35:41 · 6712 阅读 · 0 评论