C/C++
文章平均质量分 51
啊
吃米饭
这个作者很懒,什么都没留下…
展开
-
C++ 虚函数表
public ://和上上个类不同的是多了一个自身定义的虚函数. 和上个类不同的是没有基类虚函数的覆盖. virtual void derive1_fun1() {} };为嘛呢?现在继承类明明定义了自身的虚函数,但不见了?类对象的大小,以及成员偏移情况居然没有变化!要注意:我为什么使用指针的方式调用?说明一下:因为如果不使用指针调用,虚函数调用是不会发生动态绑定的哦!你若直接 d1.derive1_fun1();原创 2022-10-17 21:23:28 · 6149 阅读 · 7 评论 -
C/C++ static
普通的成员函数一般都隐含了一个this指针,this指针指向类的对象本身,因为普通成员函数总是具体的属于某个类的具体对象的。静态局部变量在全局数据区分配内存,在程序执行到该对象的声明处时被首次初始化,即以后的函数调用不再进行初始化,一般在声明处初始化,如果没有显式初始化,会被程序自动初始化为0,它始终驻留在全局数据区,直到程序运行结束。静态全局变量在全局数据区分配内存,未经初始化的会被程序自动初始化为0(自动变量的值是随机的,除非它被显式初始化),在声明它的整个文件都是可见的,而在文件之外是不可见的;原创 2022-10-13 21:58:14 · 536 阅读 · 0 评论 -
C++ const
C++ const。原创 2022-10-13 20:41:01 · 211 阅读 · 0 评论 -
C++ Protobuf
protobuf (protocol buffer) 是谷歌内部的混合语言数据标准。通过将结构化的数据进行序列化(串行化),用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。解析消息时,如果编码的消息不包含特定的单数元素,则已分析对象中的相应字段将设置为该字段的默认值。反序列化: 在其他的计算环境中,将序列化后的数据还原为数据结构和对象。序列化: 将结构数据或者对象转换成能够用于存储和传输的格式。...原创 2022-08-27 22:28:10 · 1469 阅读 · 0 评论 -
C++11实现的数据库连接池
数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;类似的还有线程池。原创 2022-08-25 14:59:16 · 984 阅读 · 0 评论 -
C++11 线程池
cpp#include<thread>#include<mutex>#include<vector>#include<condition_variable>#include<boost/circular_buffer.hpp>#include<functional>#include<atomic>#include<cassert>class ThreadPool{public: ex.原创 2022-03-09 21:48:27 · 1596 阅读 · 0 评论 -
C++ 线程安全的队列
无界队列#include<queue>#include<mutex>#include<condition_variable>#include<optional>#include<cassert>#include<thread>template<typename T,typename Container = std::queue<T>>class Queue //无界队列{public: .原创 2022-03-08 23:35:33 · 9303 阅读 · 0 评论 -
C++ 简单实现shared_ptr
共享指针管理指针的存储,提供有限的垃圾回收工具,并可能与其他对象共享该管理。shared_ptr类型的对象都能够获得指针的所有权并共享该所有权:一旦它们获得所有权,当最后一个所有者释放该所有权时,指针的所有者组就负责删除该所有者。shared_ptr对象在自身被销毁后,或者一旦其值因赋值操作或显式调用 shared_ptr::reset 而发生更改,就会释放其共同拥有的对象的所有权。一旦通过指针共享所有权的所有shared_ptr对象都释放了此所有权,则将删除托管对象(通常通过调用 ::delete,原创 2022-03-07 23:46:37 · 4323 阅读 · 0 评论 -
C++简单实现unique_ptr
唯一指针管理指针的存储,提供有限的垃圾回收工具,与内置指针相比几乎没有开销(取决于所使用的删除程序)。这些对象具有获取指针所有权的能力:一旦它们获得所有权,它们就会通过在某个时候负责删除指向的对象来管理指向的对象。unique_ptr对象在它们本身被销毁时,或者一旦它们的值通过赋值操作或显式调用unique_ptr::reset而改变,就会自动删除它们所管理的对象(使用删除器)。unique_ptr对象唯一地拥有其指针:任何其他工具都不应负责删除该对象,因此任何其他托管指针都不应指向其托管对象,因为原创 2022-03-07 20:19:59 · 2037 阅读 · 2 评论 -
C++ 简单实现vector
向量向量是序列容器,表示可以更改大小的数组。就像数组一样,向量对其元素使用连续的存储位置,这意味着也可以使用指向其元素的常规指针上的偏移量来访问其元素,并且与数组一样高效。但与数组不同的是,它们的大小可以动态变化,它们的存储由容器自动处理。在内部,向量使用动态分配的数组来存储其元素。可能需要重新分配此数组,以便在插入新元素时增加大小,这意味着分配新数组并将所有元素移动到该数组。就处理时间而言,这是一项相对昂贵的任务,因此,每次将元素添加到容器时,向量都不会重新分配。相反,向量容器可以分配一些额外的存原创 2022-03-06 22:38:15 · 1773 阅读 · 0 评论 -
C++ atomic
thread#include <iostream>#include <utility>#include <thread>#include <chrono> void f1(int n){ for (int i = 0; i < 5; ++i) { std::cout << "Thread 1 executing\n"; ++n; std::this_thread::slee原创 2022-03-02 23:21:41 · 2041 阅读 · 0 评论 -
C++ future
promise空模板非 void 特化,用于在线程间交流对象void 特化,用于交流无状态事件类模板 std::promise 提供存储值或异常的设施,之后通过 std::promise 对象所创建的 std::future 对象异步获得结果。注意 std::promise 只应当使用一次。每个 promise 与共享状态关联,共享状态含有一些状态信息和可能仍未求值的结果,它求值为值(可能为 void )或求值为异常。 promise 可以对共享状态做三件事:使就绪: promise 存储原创 2022-03-02 23:03:25 · 5340 阅读 · 0 评论 -
C++ 条件变量
condition_variablecondition_variable 类是同步原语,能用于阻塞一个线程,或同时阻塞多个线程,直至另一线程修改共享变量(条件)并通知 condition_variable 。有意修改变量的线程必须获得 std::mutex (常通过 std::lock_guard )在保有锁时进行修改在 std::condition_variable 上执行 notify_one 或 notify_all(不需要为通知保有锁)即使共享变量是原子的,也必须在互斥下修改它,以正原创 2022-03-02 23:01:38 · 313 阅读 · 0 评论 -
C++ 通用锁管理
lock_guard类 lock_guard 是互斥体包装器,为在作用域块期间占有互斥提供便利 RAII 风格机制。创建 lock_guard 对象时,它试图接收给定互斥的所有权。控制离开创建 lock_guard 对象的作用域时,销毁 lock_guard 并释放互斥。lock_guard 类不可复制。成员类型 mutex_type Mutex成员函数成员函数 (构造函数) 构造 lock_guard ,可选地锁定给定的互斥(公开成员函数) (析构函数) 析构 lock_guard 对象,原创 2022-03-02 23:00:41 · 643 阅读 · 0 评论 -
C++ 互斥
mutexmutex 类是能用于保护共享数据免受从多个线程同时访问的同步原语。mutex 提供排他性非递归所有权语义:调用方线程从它成功调用 lock 或 try_lock 开始,到它调用 unlock 为止占有 mutex 。线程占有 mutex 时,所有其他线程若试图要求 mutex 的所有权,则将阻塞(对于 lock 的调用)或收到 false 返回值(对于 try_lock )。调用方线程在调用 lock 或 try_lock 前必须不占有 mutex 。若 mutex 在仍为任何线程原创 2022-03-02 22:59:29 · 844 阅读 · 0 评论 -
C++ 线程
thread类 thread 表示单个执行线程。线程允许多个函数同时执行。线程在构造关联的线程对象时立即开始执行(等待任何OS调度延迟),从提供给作为构造函数参数的顶层函数开始。顶层函数的返回值将被忽略,而且若它以抛异常终止,则调用 std::terminate 。顶层函数可以通过 std::promise 或通过修改共享变量(可能需要同步,见 std::mutex 与 std::atomic )将其返回值或异常传递给调用方。std::thread 对象也可能处于不表示任何线程的状态(默认构造、被移动原创 2022-03-02 22:58:15 · 6593 阅读 · 0 评论 -
C++ 并发
何为进程?何为线程?两者有何区别?进程是系统资源分配的基本单位,线程(thread)是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。怎么理解,线程是需要扔到CPU去执行的,所以它自己只包括CPU执行的基本数据,如程序计数器,堆栈信息,寄存器等,其他资源都是共享的;进程是地址空间的抽象,是虚拟的,它包含一个程序要运行的一些基本资源,如I/O,文件描述符,进程数据,地址空间等,它是用来管理整个程序运行的资源的,当然它也包括上下文切换,CPU调度等,但它的调度最终还是执行在线程原创 2022-02-24 18:07:08 · 1439 阅读 · 0 评论 -
C++ 智能指针
shared_ptr智能指针也是模板类,因此当我们创建一个智能指针是要提供额外的信息——指针可以指向的类型。默认初始化的智能指针保存着一个空指针。shared_ptr允许多个指针指向同一对象。shared_ptr<string> p1; //可指向stringshared_ptr<list<int>> p2; //可指向int的listmake_shared最安全的分配和使用动态内存的方法是调用一一个名为make_shared 的标准库函数。此函数在动态内存原创 2022-02-23 19:27:10 · 2556 阅读 · 1 评论 -
Linux C++ 连接 MySQL
#include<iostream>#include<mysql/mysql.h>/*mysql_init() 获取或初始化MYSQL结构mysql_real_connect() 连接到MySQL服务器。mysql_query() 执行指定为“以Null终结的字符串”的SQL查询。mysql_use_result() 初始化逐行的结果集检索。mysql_field_count() 返回上次执行语句的结果集的列数。mysql_fetch_row() 从结果集中获取下一行原创 2021-11-25 13:42:23 · 1307 阅读 · 0 评论 -
C++一些例子
虚析构#include<iostream>class Base{public: Base() { std::cout << "base 构造" << std::endl; } virtual~Base() { std::cout << "base 析构" << std::endl; }};class Derived : public Base{public: Derived() { std::cout << .原创 2021-07-24 14:54:35 · 366 阅读 · 0 评论 -
io_utils/time_utils
#pragma once#include<stdio.h>#include<stdarg.h>void PrintBinary(unsigned int value);//#define PRINT_METADATA#ifdef PRINT_METADATA#define PRINTLNF(format,...) printf("("__FILE__":%d) %s: "format"\n",__LINE__,__FUNCTION__,##__VA_ARGS__)#原创 2021-07-24 14:47:10 · 261 阅读 · 0 评论 -
可执行程序的编译过程
源文件#include<stdio.h>int main(){ printf("hello world!"); return 0;}预处理使用以下命令把.c文件进行宏展开生成.i文件gcc -E main.c -o main.i编译器对各种预处理命令进行处理,包括头文件包含、宏定义的扩展、条件编译的选择等;编译使用以下命令把.i文件编译成汇编代码gcc -S main.i -o main.s将预处理得到的源代码文件,进行“翻译转换”,.原创 2021-06-29 15:25:28 · 324 阅读 · 0 评论 -
C语言文件操作
文件字符个数#include<stdio.h>#include<locale.h>#include<wchar.h>#include"../include/io_utils.h"#define ERROR_ILLEGAL_FILENAME -1#define ERROR_CANNOT_OPEN_FILE -2#define ERROR_READ_FILE -3#define ERROR_UNSUPPORTED_CHARSET -99#define C原创 2021-06-28 20:26:27 · 123 阅读 · 0 评论 -
C语言跨平台时间操作计算时间差
头文件#pragma once#if defined(_WIN32)#include<sys/timeb.h>#if defined(__UNIX__)||defined(__APPLE__)#include<time.h>#endiftypedef long long long_time_t;long_time_t TimeInMillisecond(void) {#if defined(_WIN32) struct timeb time_buffe原创 2021-06-28 20:22:14 · 300 阅读 · 0 评论 -
C语言线程安全问题
线程安全问题#include <stdio.h>#include <tinycthread.h>#include <io_utils.h>int count = 0;int Counter(void*arg){ for(int i = 0;i<100000;i++) { count++; /* * int temp = count; * count=temp+1;原创 2021-06-28 20:03:08 · 1357 阅读 · 0 评论 -
C++类型双关
Σ(っ °Д °;)っ#include<iostream>struct Entity{ int x, y; int* GetPtr() { return &x; } /*Entity* GetPtr() { return this; }*/};int main(){ Entity e = { 1,2 }; int* ptr = (int*)&e; int x = *(int*)((char*)&e); int y = *(i原创 2021-06-17 15:52:20 · 205 阅读 · 0 评论 -
Fast多维数组
#include<iostream>#include<chrono>struct Timer{ std::chrono::time_point<std::chrono::steady_clock>start, end; std::chrono::duration<float>duration; Timer() { start = std::chrono::high_resolution_clock::now(); } ~Timer(原创 2021-06-17 15:08:19 · 100 阅读 · 0 评论 -
C++自动计时
#include<iostream>#include<chrono>struct Timer{ std::chrono::time_point<std::chrono::steady_clock>start, end; std::chrono::duration<float>duration; Timer() { start = std::chrono::high_resolution_clock::now(); } ~Timer(原创 2021-06-16 20:27:01 · 144 阅读 · 0 评论 -
vector优化
C++的stdvector使用优化#include<iostream>#include<vector>using namespace std;class Vectex{private: int x, y, z;public: Vectex(int x,int y,int z) : x(x),y(y),z(z) { } Vectex(const Vectex& vectex) { cout << "拷贝" << end原创 2021-06-16 18:02:31 · 153 阅读 · 0 评论 -
多重指针内存地址
例子#include<iostream>int main(){ char* buffer = new char[10];//创建char类型的指针数组 memset(buffer, 0, 10); //初始化为0 char** ptr = &buffer; //创建二重指针并指向一个指针 std::cin.get();}内存结构从图中我们可以看到创建的指针buffer内存地址为0x00b8f1e8且内存中都被初始化为0.这时已经执行了创建二重指针的代原创 2021-06-13 18:52:14 · 183 阅读 · 1 评论 -
'scanf': This function or variable may be unsafe
’scanf’: This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.VS认为 scanf(); 不安全。解决方法1:scanf_s();...原创 2020-04-02 21:31:10 · 317 阅读 · 0 评论 -
无法解析的外部符号 _main
就如提示错误一样,程序找不到入口。解决方法:原创 2020-04-02 21:15:16 · 503 阅读 · 0 评论 -
无法解析的外部符号 _WinMain@16
就和提示的一样,找不到程序的入口。解决办法:原创 2020-04-02 21:14:00 · 411 阅读 · 0 评论 -
cmd 输入输出
**cmd输入输出###首先在编写如:#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include <stdlib.h>void main(){ int a = 0; scanf("%d",&a); printf("%d\n",a); system("pause");...原创 2019-12-06 19:00:00 · 2067 阅读 · 0 评论