
C/C++
文章平均质量分 69
关于C/C++ 语言方面的特性
BBinChina
果然白痴
展开
-
Option类型:C++(std::optional)、Rust(Option)、Go(gob.OptionalValue)
学习Rust中的Option类型以及C++ 17的std::optional原创 2023-03-10 00:05:10 · 709 阅读 · 1 评论 -
交易系统开发技能及面试之TechCoding
文章目录概要Q1设计股票订单撮合系统,支持5000以上不同品种,单品种每天上百万订单Q2 实践:设计订单簿,用于支持下单、撤单、撮合功能,撮合采用价优方式Q3 设计一个网关用于接收用户订单并将其转发给交易撮合服务,该网关需要实现限流功能,给定 N,T两个值,表示在T微妙时间内只处理N个消息,相当于滑动窗口控制。要求设计订单控制类:根据N、T、Input,处理接收的订单流,返回pass 或者 fail。Q4 实现前缀树的插入跟搜索概要编程面试是整体面试中最核心的部分,毕竟开发者都是手艺者,需要动手跟思维都原创 2021-12-26 22:09:18 · 1440 阅读 · 1 评论 -
交易系统开发技能及面试之低延迟编程技术
文章目录概要概要原创 2021-12-21 22:42:12 · 2207 阅读 · 0 评论 -
交易系统开发技能及面试之进程间通信(共享内存)
文章目录摘要Q1 当最后一个附加到共享内存的进程意外退出时,会发生什么?Q2 为什么内存共享是最快的进程通讯方式?Q3 可以在运行时调整共享内存大小么?Q4 使用mmap实现进程间通讯有什么优点?当一个进程正在写内存时会发生什么?Q5 操作系统为什么需要虚拟内存?Q6 Application Binary Interface(ABI)和 Application Programming Interface(API)的区别?摘要共享内存是进程间通信的最常用的方式,所以其在面试中也是高频知识点。通常,共享内存原创 2021-12-07 09:00:00 · 489 阅读 · 0 评论 -
交易系统开发技能及面试之无锁编程(Lock-free)
目录概要Q1 什么是atomic?Q2 alignas 关键字Q3 C++的内存模型 relaxed ordering, release-acquire ordering, sequentially consistent ordering概要这一章内容主要讲解无锁编程相关技能,在生产中,为了解决线程间资源共享问题,最常用的方式就是加锁了,这在上一章并发编程也讲到过很多。关于无锁的时候,也写过一篇无锁队列的实现,而今天这篇文章主要是讲解无锁编程所需要了解的基础知识,比如atomics,内存模型,内存排序等原创 2021-12-03 00:27:39 · 658 阅读 · 0 评论 -
交易系统开发技能及面试题之多线程并发编程(Multithreading)
文章目录概要Q概要交易系统开发技能系列的第二部分内容:并发编程多进程、多线程编程是大型系统开发必不可少的技能,这部分内容涉及各种各样的锁,死锁,线程安全思考,以及生产者消费者模式:spsc、mpmc等等。Q...原创 2021-11-23 00:18:20 · 635 阅读 · 0 评论 -
交易系统开发技能及面试题之c++基础特性
Q1Boost库Boost.AsioBoost.Signals2Boost.ThreadBoost.Test原创 2021-11-20 18:21:53 · 2193 阅读 · 0 评论 -
大厂常见面试题: 实现Lru缓存机制
文章目录前言一、c++ 实现简易版LruCacheListunordered_map二、Java 实现LruCache前言LruCache 也叫 最近最少使用缓存,在生产中经常使用到,用作内存缓存,配合redis可以实现二级缓存,提高服务器的处理性能,而在面试中,缓存是经常被问到的,如果候选人能讲出自己实现那么是很大加分项。提示:以下是本篇文章正文内容,下面案例可供参考一、c++ 实现简易版LruCache主要运用数据结构:list、unordered_mapList采用链表方式来记录数原创 2021-09-14 23:39:59 · 272 阅读 · 0 评论 -
c++ 高并发队列的实现
JAVA如何进行CAS讲到java的队列时,讲到java中的CAS操作回顾下java中的cas,主要采用compareAndSet方法,如AtomicReference中所使用的:AtomicRefrence.java/** * Atomically sets the value to the given updated value * if the current value {@code ==} the expected value. * @param expect原创 2021-09-11 18:25:05 · 2133 阅读 · 0 评论 -
c++11 并发队列的生产方案 BlockingConcurrentQueue
ConcurrentQueue这是我在生产中使用到的一个c++11 实现的无锁队列,有以下特性:1、线程安全的无锁队列2、支持c++11 的move语义,优化对象拷贝性能3、模板化4、可预分配内存、也可动态分配5、支持批量处理6、包含阻塞队列7、异常安全demo将github里的文件 Blockingconcurrentqueue.h 跟 Concurrentqueue.h 加载到项目中#include "Blockingconcurrentqueue.h"//声明队列moody原创 2021-09-09 23:50:01 · 2174 阅读 · 0 评论 -
c++ 实现引用计数类的目的,原理及源码
在c++开发过程中,经常需要记录对象的拥有者,因为只有其有责任删除该对象,即所有权的问题,为避免内存泄漏等问题,其他高级语言比如golang、java等实现了垃圾回收机制。在c++中可以通过实现引用计数来控制对象的生命周期,某种程度上也算是一种垃圾回收机制,如果面试吹牛时,你能这么个吹风,百万年薪不时梦(老套的广告语了)。实际上,使用引用计数还有一目的:减少相同值对象的创建,比如java里的字符串string的字面值,当多个字面值一样时,不同的string对象实际上时指向同个内存地址。Demo#pra原创 2021-09-05 23:23:51 · 721 阅读 · 0 评论 -
C++ Actor并发模型框架 Actor Framework (CAF)
什么是ACTOR 并发模型Actor 是一种处理并发计算的基本模型,主要概念是通过OO 面向对象思想,将计算单元独立成一个对象,在模型中成为Actor,各个独立计算单元之间的通信通过mailbox(邮箱),每个Actor维护自己的mailbox,mailbox存储的是需要消费的消息。这里扩散一下知识,在更早期出现的ESB(enterprise service bus)企业服务总线模型是将服务接到消息总线上,服务获取总线上投递给他的消息。这种方式存在耦合,以及需要一个个服务进行确认,直到消费者进行确认消原创 2021-06-04 00:24:25 · 5257 阅读 · 2 评论 -
数组首地址&a偏移一个单位
po上代码先:#include <stdio.h>void main(){ int a[5] = {1,2,3,4,5}; int *ptr = (int *)(&a + 1); printf("%d,%d",*(a+1),*(ptr-1));}这里&a + 1是我在编程中所出现的疑点。 一开始我的认为是&a跟a均表示数组首元素的地址。如当*(a+1)输出2时,便是很原创 2015-03-11 19:15:09 · 1149 阅读 · 0 评论 -
12个有趣的C语言问答
今天在微信公众号CPP开发者上看到了这篇文,特此与大家分享下。1、gets()方法。 1 #include <stdio.h> 2 #include <string.h> 3 4 int main(void) 5 { 6 char buff[10]; 7 memset(buff,0,sizeof(buff)); 8 9原创 2015-03-08 11:38:52 · 635 阅读 · 0 评论 -
给函数传递二维数组指针
很多时候,函数的形参很容易定义为指针的指针形式(如:int **number),这样可用来表示指向整型指针的指针,但我们传递的可是一个二维数组,其指针该是指向整型数组的指针。这就是容易出现模糊的点。那如果形参形式是(int **number)这种形式也是有其优点的,从例子中来说明:先定义实参:int input[2][2] = {1,2,3,4};int **p1 = new int*[2];fo原创 2015-03-05 11:16:47 · 1827 阅读 · 0 评论 -
C语言:内存存储、栈、堆等区别
## 内存存储 ## 首先先了解一下C/C++的内存存储,一般把内存理解成4个分区:栈、堆、全局/静态存储区和常量存储区。 1)栈:用于那些在编译期间就能确定存储大小的变量的存储区,用于在函数作用域内创建,在离开作用域后自动销毁的变量的存储区。它的存储空间是连续的,两个紧挨着定义的局部变量,它们的存储空间也是紧挨着的。一般栈的大小有限制,所以定义超大数组时需注意,如vc++编译器的默认原创 2015-03-05 11:06:22 · 933 阅读 · 0 评论 -
window linux跨平台 字符串编码集差异
在迁移window版通讯库到linux平台上时,自定义协议遇到之前没考虑过的问题。window 下msvc编译的字符集编码与linux下 gcc编译的编码不匹配,导致协议错误。大家可能比较常见的应该是中文乱码的问题。1、先了解下字符集编码相关概念:源码字符集:the source character set,是指源代码文件是使用何种编码字符集保存的。执行字符集:the execution character set,是指源代码经过编译、链接后的可执行文件是使用何种编码字符集保存的,程序实原创 2021-04-12 23:28:08 · 880 阅读 · 1 评论 -
c++ 网络编程 之socket
服务器开发最核心的部分有网络编程即网络IO管理网络应用依赖于很多系统研究中已经学习过的概念,例如,进程、信号、字节顺序、存储器映射以及动态存储分配,接下来的文章主要内容为理解基本的客户端-服务器编程模型,实现编写一个web服务器。客户端 - 服务器编程模型网络 socket编程网络应用依赖于很多系统研究中已经学习过的概念,例如,进程、信号、字节顺序、存储器映射以及动态存储分配,接下来的文章主要内容为理解基本的客户端-服务器编程模型,实现编写一个web服务器。客户端 - 服务器编程模型俗称的cs架构,基原创 2021-03-21 22:24:00 · 321 阅读 · 0 评论 -
C++ explicit关键字声明构造函数
对用户自定义类型的对象而言,初始化由构造函数执行。 所谓default构造函数时一个可悲调用而不带任何实参者,默认构造函数可由类型隐式提供。class A{public: A(); //default构造函数};class B{public: explicit B(int X = 0,bool b = true); //default构造函数};原创 2015-03-05 11:23:05 · 706 阅读 · 0 评论 -
编写类String的构造函数、析构函数和赋值函数
当我们自定义一个类时,其构造函数、析构函数和赋值函数是最需要注意的点,为此对类String编写这三个函数来巩固自己的编程能力。 effective C++里提到:当类中包括指针类成员变量时,一定要重载其拷贝构造函数、赋值函数和析构函数.class String{ public: String(const char* str = NULL); String(const String原创 2015-03-13 10:45:55 · 563 阅读 · 0 评论 -
默认构造函数
原谅我是个菜鸟,总在些小地方不经意出错。。。#include <iostream>using namespace std;class X{public: X(int t = 0) { a = t; } X() { a = 1; } ~X() { a = 0; }private:原创 2015-03-16 15:17:30 · 534 阅读 · 0 评论 -
理解extern "C",C++函数与C函数互调
为什么需要extern “C”? extern “C” 是编译器链接指示符。需要知道,对于不同的编译器,在编译一个函数时,编译出来的函数名称或参数排列的顺序可能是不同的。这就导致用一种语言去调用另一种语言函数的时候,需要告诉编译器不同的编译器调用规则。extern “C”就是告诉编译器用C语言的规则去编译调用函数。extern "C"有两种声明形式,一种是单一语句形式,如:extern "C"原创 2015-03-08 15:42:57 · 689 阅读 · 0 评论 -
纯虚函数和抽象基类
纯虚函数的格式:virtual <类型> <函数名> (参数表) =0;而我们的纯虚函数经常被用来构建抽象基类。 抽象基类:当我们仅想对基类进行向上类型转换,使用它的接口,而不希望用户实际地创建一个基类的对象,那么我们就在基类中加入至少一个纯虚函数(pure virtual function),来使基类称为抽象(abstract)类。当继承一个抽象类时,必须实现所有的纯虚函数,否则继承出的类也将是原创 2015-03-17 11:03:36 · 804 阅读 · 0 评论 -
虚拟继承和虚基类
#include <iostream>using namespace std;class A{public: A() { cout<< "this is A constructor"<<endl; } //needly virtual ~A() { cout<<"this is A destructor"<<endl原创 2015-03-17 11:27:49 · 689 阅读 · 0 评论 -
重载new和delete,处理内存溢出
很多时候,我们使用new/delete来分配和释放内存。那么这篇问题主要讲的是,使用new来处理实际编程中可能出现的内存泄漏的问题。奇怪,既然你说delete可以释放内存呢,只要用好这两个函数,保证匹配不就得了。然后这是一种很被动的做法,当内存泄露了,问题显现出来知道时,事态可能已经很严重了。 那么我们该如何处理呢? 主要思路是重载new和delete。先提供一个如何重载全局new原创 2015-03-12 21:41:16 · 1433 阅读 · 0 评论 -
虚析构函数
之前讲过了虚函数,其实实现面向对象多态特性的机制。 那多态性里还有重要的一点便是虚析构函数。 接下来看问题重现:#include <iostream>using namespace std;class Cparent{public: Cparent() { cout<< "Cparent::constructor is called" <<endl;原创 2015-03-17 09:12:38 · 481 阅读 · 0 评论 -
赋值运算符函数 operator=
当我们写一个复制运算符函数时,主要注意以下几点: 1)令operator=返回一个reference to *this。只有返回一个引用,才允许连续赋值,如:x = y = z = 3; 参考effective C++ 条款10. 2)是否把传入的参数类型声明为常量引用,如果传入的参数不是引用而是实例,那么从形参到实参会调用一次复制构造函数。参考effective C++条款20. 同时,我原创 2015-03-05 20:30:33 · 735 阅读 · 0 评论 -
C++ 数组合并
以归并的思想解决两数组合并问题://use MergeSort#include <iostream>#include <vector>using namespace std;template <typename T>void mergeSort(vector<T> &a,vector<T> first,int firstNum,vector<T> second,int secondNum)原创 2015-03-13 20:35:45 · 5438 阅读 · 0 评论 -
虚函数,实现多态性的重要机制
按惯例以实例做分析。//Instrument1.cpp#include <iostream>using namespace std;enum note{A,B,C};class Instrument{public: void play(note) const{ cout<<"Instrument::play"<<endl; }};//Wind objects原创 2015-03-05 17:35:07 · 685 阅读 · 0 评论 -
c++ 在类中写回调函数
要注意C ++ 的类的成员函数和一般的C 函数的区别。C + + 类采用this 规则传递函数。在使用类的成员函数作为回调函数,要求该成员函数被声名为静态成员函数,并且注意函数声名的时候要同时声明好参数传递规则。 简单的示例: CallBackClass.h#ifndef CALL_BACK_CLASS_H#define CALL_BACK_CLASS_Hclass CallBack{publ原创 2015-04-17 15:58:43 · 2460 阅读 · 0 评论 -
定位 new
接触到了一个新的知识点:定位new。 其主要用来 在已经分配了的内存上再来构建类对象。 例子://Placement New Expression#include <new>#include <iostream>using namespace std;class X{public: X() { a = 'b'; } ~X() {原创 2015-03-16 11:18:00 · 706 阅读 · 0 评论