c++
文章平均质量分 76
imhikaru
这个作者很懒,什么都没留下…
展开
-
求最大公约数,最小公倍数(c++)
最大公约数, 最小公倍数原创 2022-06-16 10:55:30 · 354 阅读 · 1 评论 -
Win平台高精度Sleep实现
获取时间戳GetTickCountWindows平台, 可通过GetTickCount和GetTickCount64获取时间戳。它们底层实现是一样的, 返回值的位宽不同。GetTickCount返回uint32_t,最大值2^32,单位毫秒, 系统运行49.71天必定发生绕回的现象,程序处理不好很容易出问题,不建议使用。 GetTickCount64返回的是uint64_t,5.8亿年左右才绕回,更加直观安全。QueryPerformanceCounter (QPC)Windows平台,可通过Que原创 2021-12-28 15:52:54 · 2009 阅读 · 0 评论 -
Win平台高精度Sleep实现
获取时间戳GetTickCountWindows平台, 可通过GetTickCount和GetTickCount64获取时间戳。它们底层实现是一样的, 返回值的位宽不同。GetTickCount返回uint32_t,最大值2^32,单位毫秒, 系统运行49.71天必定发生绕回的现象,程序处理不好很容易出问题,不建议使用。 GetTickCount64返回的是uint64_t,5.8亿年左右才绕回,更加直观安全。QueryPerformanceCounter (QPC)Windows平台,可通过Que原创 2021-12-28 15:47:26 · 1734 阅读 · 1 评论 -
Windows实现主进程退出,子进程自动关闭功能
需求:软件功能用多进程实现, 由主进程创建若干子进程, 当主进程崩溃时,创建出来的子进程需要能够自动关闭。方法1:进程通信,子进程检查心跳包,一段时间没心跳包则退出进程。缺点:1.实现起来麻烦。2.不支持第三方的程序,因为别人并未实现这些心跳机制。3.依然存在可能程序有BUG, 子进程卡死不退出的现象。方法2:通过作业对象(Job Object来实现), 作业对象是Windows系统提供的对加入作业的进程做特定限制的内核对象,可以对作业中的进程组统一做时间片分配,原创 2021-12-27 12:26:50 · 2859 阅读 · 0 评论 -
Windows 进程在指定CPU上运行
Windows系统 让进程在指定CPU上运行; 进程CPU group, affinity设置; JobObject的使用;主进程退出,子进程自动结束的实现原创 2021-12-27 12:14:24 · 2812 阅读 · 0 评论 -
C++11函数重载最佳实践
参数修饰情形在C++11里,一个类型std::string有以下4种情形。std::string s= "123";// 值const std::string s_c= "456"; // 不可修改的值std::string& s_ref = s; // 引用const std::string& s_cref = s; // 不可修改的引用假如我们实现一个Test函数传入std::string作为参数,我们会遇到以下情形的调用:Test(s);Tes...原创 2021-08-27 10:48:21 · 245 阅读 · 0 评论 -
c++11 std::enable_if在模板偏特化的妙用
1.模板自动推导功能。先看个例子:在调用TestTemplate函数时, 我们可以在函数后面加上<类型>无歧义地指定调用的版本。结果如下:由于模板参数在函数参数中的位置是固定的,编译器其实可以推导出参数的类型, 这样程序员们就可以不指定模板的类型来调用,代码更加简洁清晰通用,不会出现写错模板类型的错误,如下:模板自动推导是如此的美好,我们要好好地利用它。 在应用过程中, 也引入了一些问题, 有些情况, 编译器发现某些代码满足多个同名函数模板,无法决定特化成哪...原创 2021-08-06 15:15:58 · 4921 阅读 · 3 评论 -
C/C++移位操作
C/C++移位操作1.无符号数移位2.有符号数移位总结1.无符号数移位a.规定移动的位数必须是正整数,并且不得大于或者等于类型的位宽,否则行为不确定。例如:unsigned char移动的位数必须是[0,7]unsigned short移动位数必须是[0,15]unsigned long移动位数必须是[0,31]…b.无论左移还是右移,移出位数范围的丢掉,然后补0. 移动的位数可以是0,结果与原值相同。左移n位等价于乘以2的n次方。 右移n位等价于除以2的n次方。当左移丢掉最左边的1时,在原创 2021-07-30 15:53:34 · 2015 阅读 · 0 评论 -
C/C++除法与取模运算
1.除法运算。a.全是正数时,截断取整,去掉小数部分。128 / 10 = 12;120 / 10 = 12;119 / 10 = 11;b.当被除数或者除数出现负数时,可以理解成把负号提取出来,再采取上面一样的做法。(-128) / 10 = -(128 / 10) = -12;(128) / (-10) = -(128 / 10) = -12;(-128) / (-10) = - -(128 / 10) = 128 / 10 = 12;2.取模运算。a.全是正原创 2021-07-30 10:57:42 · 2445 阅读 · 0 评论 -
c++数组初始化
c++数组初始化写法1.buf[size] = {0};char buf[4] = {0};上述代码执行以后,整个buf都初始化为0,跟我们大部分人的预想是一样。2.buf[size] = {value}; // value != 0char buf[4] = {1};上述代码执行以后, buf里的值是[0x1, 0x0, 0x0, 0x0]。 可能很多人会认为整个数组都会初始化成0x1,但是实际上不是的。3. 那么我们要把buf初始化成全是0x1, 该怎么写。c...原创 2021-04-27 11:10:55 · 6722 阅读 · 0 评论 -
sprintf, snprintf, _snprintf, sprintf_s 等的区别
1. int sprintf( char *buffer, const char *format [, argument] ... );如果成功,则返回写入的字符总数,不包括字符串追加在字符串末尾的空字符。如果失败,则返回一个负数。例子A:缓冲区足够放下整个字符串char buf[4];int sp_ret;sp_ret = sprintf(buf, "12%d", 3);成功, 返回3, 并且buf里的内容是"123\0" 一共4个字节。例子B:缓冲区不足cha..原创 2021-04-27 00:32:01 · 3930 阅读 · 2 评论 -
std::function用法
1.概述 std::function从c++11开始引入, 主要作用就是把任意的函数调用包装到一个对象里,并且这个对象,可以保存,传递,复制,然后在合适时间地点调用。 std::function是动态绑定的,函数或者类可以通过它实现,不改变任何代码,只需改变构造或者执行时传入的std::function对象就改变行为,类似多态的效果。 2.用法1.声明 std::function<int(int)> fn_half; std::function<int(in原创 2021-03-16 13:34:56 · 3826 阅读 · 0 评论 -
visual studio 远程调试
在开发的工程中,不可避免地遇到需要远程调试。例如我们只有目标机才有需要的硬件,又或者只有目标机才有足够性能等。Visual自身的远程调试功能十分强大,几乎与在本地调试没什么区别。你还在反复地改代码,加打印,重新编译,拷贝到目标机,运行看结果,再改代码改打印,重新编译...吗?重复是程序员的万恶之源,快来加入我们远程调试吧! 1.先在visual studio的安装目录搜索 Remote Debugger,找到远程调试工具。如下图。默认应该是C:\Program Files (...原创 2020-05-18 16:47:19 · 1652 阅读 · 0 评论 -
如何跟踪MFC源码
PDB文件,英文全称:Program Database File。保存着调试和项目状态信息,并且使用这些信息可以对程序的调试配置进行增量链接。当在Visual stido使用 /ZI 或者/Zi方式编译c/c++程序时,将会生成一个以该项目命名的.PDB文件。 如果没有PDB文件,将无法查看堆栈里的具体信息,以及查看源码的功能。 如果我们想跟踪MFC的源码,必须要有相应的P转载 2013-04-26 01:39:50 · 1330 阅读 · 0 评论 -
Visuals studio 2005项目属性配置要点
要编程开发产品,除了对编程语言的运用外,还需要一个协助你编程的环境。现代的开发工具功能异常强大,方便地重构,代码自动补全,各种调试神器,让你做起事来事半功倍。我是用Visual studio 2005来做开发的,今天猛地发现,原来对这个环境还有很多东西值得我们去探究。Debug 和 Release的区别 Debug顾名思义就是调试版,生成的程序没有经过优化并且包含跟踪需要的调原创 2012-10-10 15:39:53 · 928 阅读 · 0 评论 -
Windows socket之最简单的socket程序
最简单的服务器的socket程序流程如下(面向连接的TCP连接 ):1. WSAStartup(); 初始化网络库的使用。2. socket(); 获得一个socket。3. bind(); 把获得的socket绑定到一个ip 和端口。既然作为服务器, ip通常为本地IP127.0.0.1。4. listen(); 监听已经绑定了指定端口的socket。5. accept();原创 2012-02-03 16:17:54 · 10607 阅读 · 0 评论