C++
文章平均质量分 79
哲这这
微信:asd_zhe
展开
-
C++实现多级时间轮定时器
最近实现了一个多级时间轮定时器,经过了简单的测试,如果将时钟步长设置为10ms以内误差会比较大。最新代码地址TimeWheel Github。特性C++11实现可自定义时间轮层级可自定义时间轮刻度可设置时钟步长误差基本在时钟步长以内推荐时钟步长50ms类介绍代码由三个类组成:Timer,TimeWheel,TimeWheelScheduler。Timer:定时器类,封装了定时器任务std::function<void()>。TimeWheel:时间轮类,每个时间.原创 2020-10-05 11:52:19 · 2797 阅读 · 0 评论 -
使用VSCODE生成调试Linux下C++的CMake项目
以epoll-server项目为例,通过VSCODE编译并调试。该形目由CMake构建,目标在该目录下生成build目录,通过CMake生成Makefile工程到build目录下,然后在build目录下执行make命令进行编译,最后通过VSCODE进行调试。Build代码目录用VSCODE WSL模式打开该目录。在.vscode文件夹下面创建task.json。task.json{ "version": "2.0.0", "tasks": [ {..原创 2020-09-16 17:10:32 · 1610 阅读 · 0 评论 -
C++11的移动语义
问题一:当给函数传递对象当做函数参数时,可以使用引用类型来减少拷贝对象的代价,尤其是避免容器的拷贝等。 但是当把函数内的局部对象当做返回值时,我们无法返回该局部对象的引用,导致每次返回局部对象都会进行拷贝。 因为返回局部对象的引用是无意义的,当函数调用完成,局部对象就被析构,所以其引用指向了一块析构的内存。解决方案一: 将输出作为函数参数,例如:void GetStudents(std::vect...原创 2018-04-09 23:38:22 · 4089 阅读 · 1 评论 -
C++在头文件中定义const变量或static变量
问题引入&nbsp;&nbsp;代码中总能看到有的人喜欢在头文件中定义const变量,或者在头文件中定义const变量。最常见的就是在头文件中定义字符串,例如在头文件def.h中定义变量:// defs.hstatic std::string s_str = "Static"; const std::string kStr = "Const";这样写就可以在需要用到该字符串的地方引...原创 2018-08-16 00:09:04 · 21961 阅读 · 1 评论 -
C++ placement new 操作符
placement new 操作符可以在一块内存上面调用构造函数去构造一个对象。operator new 操作符可以申请一块内存,返回该内存的指针void*。&amp;nbsp;&amp;nbsp;通过这两个操作符的结合使用,可以延迟对象的构造,也可以避免重复的申请释放内存,而在一块内存上面不断地进行对象的构造析构,从而提高效率,并且减少了内存碎片的产生。 &amp;nbsp;&amp;nbsp;接下来举个例子,...原创 2018-09-03 22:07:26 · 288 阅读 · 0 评论 -
C++11实现线程安全的单例模式(使用std::call_once)
1. 饿汉模式使用饿汉模式实现单例是十分简单的,并且有效避免了线程安全问题,因为将该单例对象定义为static变量,程序启动即将其构造完成了。代码实现:#include &amp;lt;iostream&amp;gt;class Singleton {public: static Singleton&amp;amp; GetInstance() { static Singleton intanc...原创 2018-09-03 23:09:31 · 18578 阅读 · 11 评论 -
C++实现线程安全的队列
C++标准库已经提供了std::queue这一队列容器,但不是线程安全的。std::queue这个容器已经提供了pop(),push(),empty()等这些读写操作容器的函数,只要在这些函数上面加个锁,就可以使其线程安全。 在C++原有容器上面进行简单封装即可实现一个线程安全的队列,实现代码如下:#include <iostream...原创 2018-09-13 00:11:53 · 20680 阅读 · 10 评论 -
C++刷新托盘程序
项目中需要重启一个托盘程序。但是重启之后,任务栏的托盘程序图标增加了一个,原来的图标并没有消失。原来任务栏的托盘程序图标,当鼠标在上面移动过之后才会刷新。所以一个解决办法就是模拟鼠标事件,模拟鼠标在上面的所有图标都移动过。但是这种办法对于图标在隐藏任务栏中则不起作用。#include <windows.h>#include <iostream>int main()...原创 2019-02-28 20:59:36 · 1602 阅读 · 1 评论 -
使用相对路径的问题
问题引入项目中需要集成其他团队做的一个带有界面的工具。使用该工具时碰到了如下问题:直接双击这个工具的exe,可以正常启动。通过程序调用,或者用Everything打开这个工具,工具可以启动,但是界面上的图标全部消失了。问题分析打开命令行,执行目录切换到该exe目录下,然后调用该exe,正常启动。将执行目录切换到上上级目录,然后调用该exe,工具不能正常启动,图标全部消失。通过分析,...原创 2019-02-25 21:47:40 · 1244 阅读 · 0 评论 -
使用pugixml创建并解析XML
创建并读取如下xml文件: MaZhe 18 Miki 19 Maki 20 代码实现:#include #include #include #include #include "pugixml.hpp"static const char* kFileName = "students2.xml";struct原创 2017-11-02 22:14:17 · 5534 阅读 · 0 评论 -
使用tinyxml创建及解析XML文件
创建并读取如下xml文件: MaZhe 18 MaZhe 18 MaZhe 18 代码实现:#include #include #include #include #include #include "tinyxml.h"using namespace std;static c原创 2017-10-25 23:26:48 · 2479 阅读 · 0 评论 -
const修饰的多级指针
#include #include #include #include int main02() { //const char* kStrArray[100] = { // "1", // "2" //}; const char* kStrArray[100] = { NULL }; for (int i = 0; i < 99; ++i) { i原创 2017-10-16 20:24:35 · 611 阅读 · 0 评论 -
winsock实现TCP通信Demo
Client#define _WINSOCK_DEPRECATED_NO_WARNINGS#include #include #include // 包含网络通信头文件#pragma comment(lib, "ws2_32.lib")#define PORT 8888#define SERVER_IP "127.0.0.1"#define BUFFER_SIZE原创 2017-08-08 22:07:31 · 1616 阅读 · 0 评论 -
winsock实现UDP通信DEMO
Client#define _WINSOCK_DEPRECATED_NO_WARNINGS#include #include #include #include #include #pragma comment(lib, "ws2_32.lib")namespace udp_client {class UdpClient {public: bool InitWi原创 2017-08-08 22:11:21 · 3326 阅读 · 0 评论 -
C++使用ODBC访问SqlServer
#include #include #include #include #include "windows.h"#include "sql.h"#include "sqlext.h"#include "sqltypes.h"#pragma comment(lib, "odbc32.lib")// 1.参考:https://zh.wikipedia.org/zh-cn/O原创 2017-08-03 21:53:14 · 3458 阅读 · 2 评论 -
学习中科院薛景瑄C++
LESSON 11.大学学习,不但要学习基础知识,更要培养思维能力。2.两遍编译过程(two-pass compiling)大部分编程语言采用单遍编译过程,但C和C++语言却都采用两遍编译过程:(1)第一遍(first pass):将源程序文件编译为汇编语言文件,汇编语言文件名称的后缀为 asm等。一般编程人员不使用这类文件。调试程序时如果希望阅读汇编语言文件,可以在调原创 2017-08-03 21:45:55 · 785 阅读 · 1 评论 -
学习中科院杨力祥c++
在网络上有幸看到中科院杨力祥老师的C++教学视频,万分受益,学习之余做了简单记录。原创 2017-08-03 21:34:43 · 4151 阅读 · 3 评论 -
C++实现String类
头文件: my_string.h#ifndef MY_STRING_H_#define MY_STRING_H_#pragma once#include class MyString {public: MyString(); MyString(const char* c_str); MyString(size_t n, char ch); MyString(con原创 2017-10-20 23:27:19 · 393 阅读 · 0 评论 -
C++可变长参数va_list的使用
#include #include #include #include #include templatestatic void Test(int va_list_len, ...) { va_list arguments; va_start(arguments, va_list_len); for (int i = 0; i < va_list_len; ++i) {原创 2017-10-20 23:33:41 · 1257 阅读 · 0 评论 -
C++重载类型
#include #include #include #include using namespace std;class Date {public: Date(int x, int y) : x_(x) , y_(y) { } void Print() { cout << x_ << " : " << y_ << endl; }pri原创 2017-10-20 23:34:40 · 1414 阅读 · 0 评论 -
使用VS调试Dump文件
(一) 调试Dump文件步骤1. 准备调试所需要的文件放到一个文件夹:dump文件,程序编译生成的pdb文件(版本必须是产生崩溃的那个版本的编译信息),可执行文件(发生崩溃的版本)。如下图:2. 使用visual studio打开上图中的dump文件。然后配置该程序的代码路径(代码会滚到该程序所处的版本),如下图,3. 点击调试,如图,原创 2017-11-08 23:28:09 · 30423 阅读 · 0 评论 -
C++智能指针简单实现
#include #include #include #include namespace smart_pointer {// RAII(Resource Acquisition Is Initialization):资源分配即初始化,是管理资源、避免内存泄露的方法。// 方法是:定义一个类来封装资源的分配和释放,在构造函数完成资源的分配和初始化,在析构函数完成资源的的清理,可以保原创 2017-08-08 22:03:46 · 301 阅读 · 0 评论