
c/c++
ningto.com
个人站点:https://ningto.com
展开
-
jemalloc C++实践
jemalloc是一种通用的malloc(3)实现,优点是避免内存碎片和可伸缩并发支持。下载源码wget https://github.com/jemalloc/jemalloc/releases/download/5.2.1/jemalloc-5.2.1.tar.bz2解压tar -jxvf jemalloc-5.2.1编译安装cd jemalloc-5.2.1./configuremakemake install我的是Centos安装后头文件在/usr/local/inclu原创 2021-01-13 14:30:06 · 2342 阅读 · 1 评论 -
malloc_trim和SetProcessWorkingSetSize两个神奇的内存相关函数
它们两个其实没有什么关系,相似之处是调用这两个函数后内存会有明显的下降,但是原理完全不同。malloc_trimlinux平台的函数,官方的解释是:从堆释放可用内存。在程序中堆上new或者malloc的内存我们都会delete和free掉,由于linux的机制它们并没有立即将释放的内存归还给操作系统,这个也是正常的不用担心,因为linux会充分利用内存提高系统的性能。正常情况下我们也不会调用这个函数,只要正常调用了delete和free就可以了。但是如果你内存不够,或者某个操作占用了太高的内存,之后又原创 2021-01-12 07:56:18 · 3433 阅读 · 0 评论 -
QWidget QLabel没有响应keyEvent键盘事件
在Qt中我们经常通过重写下面两种虚函数来实现按键事件virtual void keyPressEvent(QKeyEvent *event);bool eventFilter(QObject* watched, QEvent* event);但是有时候会遇到无法触发的情况(特别是QWidget,QLabel),这个时候我们会考虑是不是被父窗口给截获了没有传递给子窗口。如果依旧没有解决问题,那可能是这个widget没有焦点的缘故,通常可以通过鼠标点击和tab键可以获取焦点,但是像QWidget、QL原创 2021-01-12 07:55:18 · 2070 阅读 · 0 评论 -
多线程锁key处理
目的是要保证多个线程处理同一个key的消息时是线程安全的,同时是顺序的。收到网络过来的消息,将消息缓存到total msg cache里解析业务消息找到每条数据的key(可能一条或多条)存储在set中将所有key进行hash,对最大线程数进行取余,获取所有线程索引std::set indexList如果消息没有index即没有key,就轮询分发给otherThread处理有index的消息,根据index分发给线程,如果一个消息有多个index,对应的一个消息会分发给多个线程(keyThread原创 2021-01-12 07:52:29 · 438 阅读 · 1 评论 -
sqlite3 安装、开发
SQLite is a C-language library that implements a small, fast, self-contained, high-reliability, full-featured, SQL database engine. SQLite is the most used database engine in the world. SQLite is built into all mobile phones and most computers and comes bu原创 2021-01-12 07:50:22 · 348 阅读 · 0 评论 -
qt.network.ssl: QSslSocket Qt支持SSL https
Qt使用QNetworkAccessManager类时默认是不支持https协议的,需要增加openssl动态库。我发现新版本的Qt和老版本的Qt所需要的openssl库的名字竟然不一样。老的是:libeay32.dll、ssleay32.dll新的是:libcrypto-1_1.dll、libssl-1_1.dll具体的文件可以在QtCreator包里面去找。...原创 2021-01-12 07:48:54 · 410 阅读 · 0 评论 -
QTableWidget整行高亮去虚线,样式定制
很常见的一种需求,但是很可惜Qt没有一种比较简单的实现方式。在网上找了很多资料也没有找到,实现方法比较复杂,但是经过我的实验,下面这种方法是可行的,而且有很多意想不到的好处。定义接口类存储当前hovered行,split行是实现其他需求的可以不考虑 class IView { public: virtual void setHoveredRow(int row) { row_ = row; } virtual void setSplitRow(int row) { splitRow_ =原创 2021-01-12 07:47:44 · 1515 阅读 · 0 评论 -
C++11 实现defer
defer函数功能还是蛮常用的,它是在出当前作用域的时候执行,用来回收资源非常合适,可惜C++里面没有,以前实现起来都比较别扭现在用C++11实现后看起来简单多了。此defer内部lambda表达式捕获的是引用;同一个作用域内先定义的defer后执行;使用define以及x##y连接符的作用是,每次定义的局部变量名都是唯一的,使用起来非常方便,否则你可能需要像下面这种写法,每次还要考虑局部变量名不能重名,可能是如下写法: auto _defer_ = defer_func([] {原创 2021-01-07 09:45:18 · 859 阅读 · 0 评论 -
Qt写的截图工具
Qt写的截图工具,没时间维护开源了,有兴趣的Star一下吧,有时间再写代码相关的介绍吧!源码:https://github.com/tujiaw/ntscreenshot已编译好的绿色包下载ntscreenshotwindows截图工具功能列表基本的截图功能全局快捷键设置开机自启动移动鼠标自动感知选区放大器,放大当前鼠标所在像素点周围区域显示选区大小,鼠标光标坐标,光标所在位置像素的颜色c键复制当前颜色移动鼠标选择选区方向键进行像素级移动保存截图到剪切板保存截图到文件目录原创 2021-01-06 14:45:33 · 753 阅读 · 5 评论 -
const_cast、static_cast、reinterpret_cast、dynamic_cast
1.const_cast:const Person *getEmployee() { ... }Person *anEmployee = const_cast(getEmployee());使用const_cast来剥除getEmployee返回类型中的const修饰符。2.static_cast:Shape *sp = new Circle;//子类转换为父类不需要说明Circle *cp = static_cast(sp);//父类转换为子类要进行显示说明可以这样说:圆是形状中的一种, 但是形状原创 2010-12-27 21:03:00 · 967 阅读 · 0 评论 -
宽字符函数与普通C函数
字符分类:宽字符函数普通C函数描述iswalnum()isalnum()测试字符是否为数字或字母iswalpha()isalpha()测试字符是否是字母iswcntrl()iscntrl()测试字符是否是控制符iswdigit()isdigit()测试字符是否为数字iswgraph()isgraph()测试字符是否是可见字符iswlower()islower()测试字符是否是小写字符iswprint()isprint()测试字符是否是可打印字符iswpunct()ispunct()测试字符是否是标点符号is转载 2010-12-28 16:42:00 · 1302 阅读 · 0 评论 -
const用法
const允许你指定一个语义约束(也就是指定一个“不该被改动”的对象),而编译器会强制实施这项约束。它允许你告诉编译器和其他程序员某值应该保持不变。编程时如果需要保持某个值不变, 你就应该用const, 这样编译器就会确保这条约束不被违反。void func(int * const val)//地址不能变(*(val++)); //错误, 地址改变了*val = 100; //正确, 值改变了void func(const int * val)//所指的值不能变void func(i原创 2011-01-04 23:08:00 · 921 阅读 · 1 评论 -
表驱动法介绍 (简单易懂)
函数指针的使用其实是很灵活的,它有很多技巧性很高的应用,在表驱动方法中的应用很典型,这里着重介绍一下。1 什么是表驱动方法表是几乎所有数据结构课本都要讨论的非常有用的数据结构。表驱动方法出于特定的目的来使用表,下面将对此进行讨论。程序员们经常谈到"表驱动"方法,但是课本中却从未提到过什么是"表驱动"方法。表驱动方法是一种使你可以在表中查找信息,而不必用很多的逻辑语句(if或Case)来把它们找出来转载 2011-07-02 22:54:45 · 956 阅读 · 0 评论 -
STL 学习资料
收集的一些STL的学习资料:什么是STL?STL(Standard Template Library),即标准模板库,是一个具有工业强度的,高效的C++程序库。它被容纳于C++标准程序库(C++ Standard Library)中,是ANSI/ISO C++标准中最新的也是极具原创 2011-07-07 10:42:55 · 942 阅读 · 0 评论 -
拷贝构造与赋值操作(string实例)
拷贝构造和赋值这两个操作总是被成对地声明并且兼容,为什么要自定义这两个操作呢?看下面的例子。// MyString.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include #include class MyString{原创 2010-12-28 19:03:00 · 2010 阅读 · 0 评论 -
C++多态的实现原理
1. 用virtual关键字申明的函数叫做虚函数,虚函数肯定是类的成员函数。2. 存在虚函数的类都有一个一维的虚函数表叫做虚表。类的对象有一个指向虚表开始的虚指针。虚表是和类对应的,虚表指针是和对象对应的。3. 多态性是一个接口多种实现,是面向对象的核心。分为类的多态性和转载 2011-09-06 15:13:49 · 43439 阅读 · 18 评论 -
C/C++面试题(整理)
1.new、delete、malloc、free关系答:new和delete,malloc和free都可以用来申请动态内存和释放内存。malloc和free是C/C++语言的标准库函数,new和delete是C++的运算符。new和delete在分配内存时会执行构造函数,de原创 2011-09-07 10:06:18 · 1818 阅读 · 0 评论 -
对char与wchar_t一些疑惑的理解
对于char和wchar_t我们知道前者用来存储一个字节后者可以用来存储两个字节,所以像字母数字之类的ascii编码的字符都可以用char来存储。然而,汉字是需要两个字节才能存储的,所以用wchar_t才能符合我们的需求。但是我们经常看到char用于一些汉字方面的处理,这样就产生原创 2011-08-17 15:23:03 · 3636 阅读 · 6 评论 -
函数外初始化与函数内初始化
关于函数外初始化与函数内初始化之前一直分的不是太清,也不太在意。昨天终于出现了这方面的问题,所以决定好好看下,以下是这次的一些收获,先看测试代码:#include "stdafx.h"#include using namespace std;bool FillStr(c原创 2011-04-29 17:13:00 · 914 阅读 · 0 评论 -
scanf、sscanf中的正则表达式
1、定制自己的扫描集 %[abc]、%[a-z]、%[^abc]、%[^a-z],比isdigit()、isalpha()更加灵活。[]内是匹配的字符,^表示求反集。int i;char str[80], str2[80];// scanf("%d%[abc]%s", &i, str, str2); // printf("%d %s %s/n",i,str,str2);// scanf(转载 2011-01-14 18:09:00 · 18839 阅读 · 1 评论 -
STL transform用法
/*////////////////////////////////template OutputIterator transform ( InputIterator first1, // 源容器的起始地址 InputIterator last1, // 源容器的终止地址 OutputIterator result, // 目标容器的起始地址 Un原创 2011-11-16 12:11:55 · 10817 阅读 · 0 评论 -
STL sort用法
sort函数有两个参数和三个参数的,两个参数的简单些只需起始iterator和终止iterator。下面用一个例子说明三个参数的sort函数的用法:如:34 234324 21346 26 3546 5对第一列进行排序,第二列对应原先的数值保持不变,排序后:6 3534原创 2011-11-27 21:36:17 · 908 阅读 · 0 评论 -
C++读写XML文件(Libxml2库)
C++程序有时候要读写XML文件, 这里介绍一个读写XML文件的库——Libxml2。主页:http://xmlsoft.org/index.html入门教程很详细的:http://jianlee.ylinux.org/Computer/C/libxml.html#sec11读取节点内容的话用XPath方式比较好,要问XPath与Libxml2库之间的关系,有个很形象的比喻:那就是原创 2011-12-07 21:47:42 · 10907 阅读 · 0 评论 -
C语言 统计单词个数
写一个程序统计一个单词(不区分大小写)在文章中出现的次数(单词指一个英文单词,全部由小写英文字母组成。单词的前后必须是符号字符或空字符)。输入:第一行是一些句子,表示一篇文章。(文章的长度不超过10000个字符)。第二行是一个数字N(1≤N≤1062),代表查询的单词的数目。以下每行一个单词(单词由小写英文字母组成,长度不超过20)。输出:每组测试数据输出一行,表示这个原创 2011-12-10 00:53:43 · 20004 阅读 · 1 评论 -
可变参数
那天无意中发现这个帖子,感觉写的不错,那到这里来,给大家共享一下(非常抱歉原地址忘记了)! 某些情况下希望函数的参数个数可以根据需要确定。典型的例子有大家熟悉的函数printf()、scanf()和系统调用execl()等。那么它们是怎样实现的呢?C编译器通常提供了一系列处理这种情况的宏,以屏蔽不同的硬件平台造成的差异,增加程序的可移植性。这些宏包括va_start、va_转载 2011-01-18 09:31:00 · 695 阅读 · 0 评论 -
头文件宏定义
/* Guard C code in headers, while including them from C++ */#ifdef __cplusplus# define G_BEGIN_DECLS extern "C" {# define G_END_DECLS }#else# define G_BEGIN_DECLS# define G_END_DECLS原创 2012-01-31 08:55:54 · 1353 阅读 · 0 评论 -
精灵程序
精灵进程(daemon)是生存期长的一种进程。它们常常在系统引导装入时起动,在系统关闭时终止。因为它们没有控制终端,所以说它们是在后台运行的。UNIX系统有很多精灵进程,它们执行日常事物活动。编程规则:(1) 首先做的是调用fork,然后使父进程exit。这样做实现了下面几点:第一,如果该精灵进程是由一条简单shell命令起动的,那么使父进程终止使得shell认为这条命令已原创 2012-02-02 18:12:42 · 1248 阅读 · 0 评论 -
sigsetjmp用法
相关函数:longjmp, siglongjmp, setjmp 表头文件:#include 函数定义:int sigsetjmp(sigjmp_buf env, int savesigs) 函数说明:sigsetjmp()会保存目前堆栈环境,然后将目前的地址作一个记号,而在程序其他地方调用siglongjmp()时便会直接跳到这个记号位置,然后还原堆栈,继续程序的执行。 参原创 2012-02-03 12:33:14 · 16379 阅读 · 1 评论 -
模拟glib中双链表的部分实现
// GList.h#ifndef GLIST_H_INCLUDED#define GLIST_H_INCLUDED#ifdef _cplusplusextern "C" {#endiftypedef struct _GList GList;struct _GList{ void* data; GList *next; GList *prev;};原创 2012-02-02 18:22:28 · 1067 阅读 · 0 评论 -
STL 什么时候用哪种容器
As a supplement to the table, the following rules of thumb might help:By default, you should use a vector. It has the simplest internal data structure and provides random access. Thus, data acce转载 2012-02-12 22:19:42 · 956 阅读 · 0 评论 -
当年的毕业设计 - MFC信息管理系统
由于程序只能在远程服务器上跑,调试起来非常麻烦,所以想弄一个UDP的日志服务程序,能实时的显示远程程序打印过来的日志。于是就想到了用MFC弄一个继承自CListView的单文档应用程序。 话说MFC还是我大学时候做毕业设计时用过, 距离现在都两年了,好多API也忘得差不多了。不过参照以前的毕业设计还是弄出来了。想来虽然当初编程水平不咋的,但是程序还是有一些参考价值。原创 2012-03-08 17:46:25 · 8083 阅读 · 5 评论 -
C语言模拟虚基类 - 模拟lighttpd fdevent实现
看了lighttpd中的fdevent的实现过程有些巧妙,写个例子模拟它的的实现:虚基类是fdos(os操作系统,fd是随便加的没什么意义),它有三个派生类分别是:windows, linux, mac,它们的都有的public方法是:open, close, playgame。/// fdos.h#ifndef FDOS_H_INCLUDED#define FDOS_H_I原创 2012-02-12 21:44:26 · 1413 阅读 · 0 评论 -
Rio包
// 读写网络套接字时,由于内部缓冲约束和较长的网络延迟会引起read和write返回不足值。// Rio包可以解决上述问题进行健壮地读和写#include #include #include ssize_t rio_readn(int fd, void *usrbuf, size_t n){ size_t nleft = n; ssize_t nread;原创 2012-03-31 12:32:53 · 2849 阅读 · 0 评论 -
创建多个线程的参数传递问题
先看下面的程序thread1.c:#include #include #include void *thread_func(void *var);int main(void){ pthread_t tid; int var; int i; for (i=0; i<20; i++) { var = i;原创 2012-04-18 18:14:39 · 1617 阅读 · 1 评论 -
进程监视
linux下经常要监视一个进程的运行,如果这个进程由于各种原因崩溃或退出了需要让监视它的程序重新把它运行起来,下面给出一种实现方法:1.首先要保证一个程序只有一个实例在运行,避免重复启动: 在程序的main函数入口处先获取自身的PID保存在一个指定的文件中,之后程序在运行的时候我们就可以从这个文件中取出PID来判断程序是否在运行了。实际代码中main()函数里面前两行原创 2012-05-03 12:31:36 · 1210 阅读 · 0 评论 -
STL —— for_each与仿函数、函数指针
#include #include #include using namespace std;class PrintInt{public: void operator() (int elem) const { cout << elem << '\t'; }};class PrintInt2{public: PrintInt2(原创 2012-03-26 17:33:10 · 1342 阅读 · 0 评论 -
C语言日历
// 根据网友的一个问题整理的// 输入年月,显示当前日历, 然后按下左右方向键会显示上个月或下个月的日历,按其他键两次退出#include #include#include#includebool IsLeapYear(int year) { if ((0==year%4 && 0!=year%100) || 0==year%400) { return true原创 2011-11-20 10:29:58 · 2303 阅读 · 1 评论 -
C++读取文件中的内容
题目要求:txt文本中的内容格式如下:!name1number=4point=1 2 3 4 5 6 7 8获取点的个数和值#include #include #include #include using namespace std;typedef struct _point POINT;typedef struct _point* HPOIN原创 2011-11-19 14:38:11 · 3115 阅读 · 0 评论 -
统计程序实例的个数
/**********windows核心编程实例17-AppInst**********//***展示:应用程序如何知道在任一时刻有多少个自己的实例正在运行***/#include #include "resource.h"int g_uMsgAppInstCountUpdate = WM_APP + 123;#pragma data_seg("Shared")volatile原创 2011-08-10 17:28:36 · 770 阅读 · 0 评论 -
用内存映射的方式在文件末尾追加一个hello
#include #include using namespace std;int _tmain(int argc, _TCHAR* argv[]){ HANDLE hFile = CreateFile("one.dat", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EX原创 2011-08-10 17:22:10 · 1558 阅读 · 0 评论