Rax

C++基础知识

余生长醉 提交于 2021-02-14 23:55:02
链接:https://zhuanlan.zhihu.com/p/38399566 本文主要提一下以下三个区别: 引用必须初始化,而指针可以不初始化。 我们在定义一个引用的时候必须为其指定一个初始值,但是指针却不需要。 int &r; //不合法,没有初始化引用 int *p; //合法,但p为野指针,使用需要小心 2. 引用不能为空,而指针可以为空。 由于引用不能为空,所以我们在使用引用的时候不需要测试其合法性,而在使用指针的时候需要首先判断指针是否为空指针,否则可能会引起程序崩溃。 void test_p(int* p) { if(p != nullptr) //对p所指对象赋值时需先判断p是否为空指针 *p = 3; return; } void test_r(int& r) { r = 3; //由于引用不能为空,所以此处无需判断r的有效性就可以对r直接赋值 return; } 3. 引用不能更换目标 指针可以随时改变指向,但是引用只能指向初始化时指向的对象,无法改变。 int a = 1; int b = 2; int &r = a; //初始化引用r指向变量a int *p = &a; //初始化指针p指向变量a p = &b; //指针p指向了变量b r = b; //引用r依然指向a,但a的值变成了b 引用的使用场景 只看两者区别的话

0到1:闲鱼高复杂度高性能社区圈子开发实录

感情迁移 提交于 2021-02-02 21:56:24
闲鱼会玩社区的重要阵地:会玩圈子今年年初已经上线啦~ 作为一款承载着「基于兴趣聚集同好人群」的社区型产品,相较于常规导购型产品来说,在业务复杂度、交互复杂度、性能体验稳定性要求上都要高出许多,像 多角色区分 、 嵌套滚动 、 多形态 Feeds 无限加载 、 颜文字等特殊字符处理 、 页面直开 、 视频播控 等场景都是导购场景很少遇到的。 本文将围绕着会玩圈子的前端设计、开发过程中遇到的典型问题进行介绍。 关键设计 如上图为会玩圈子的设计大图,可以看到整体的业务逻辑相对较为复杂。并且由于应用中存在 多种角色状态 ,不同角色的用户展示界面和操作逻辑也有差异点存在,前端同学进行开发上手的成本较高。 为了降低前端同学在开发过程中对于全局业务理解的成本,减少沟通中信息传递容易遗漏的问题。我们在设计之初首先进行了最小模块的拆分工作。以模块维度来分配相应的工作,将模块间存在数据共享和数据通信行为进行梳理拆解,以最优方式来分配数据状态维护的最小闭环,降低组件间耦合度。 1. 模块拆分 在此处定义的模块不是前端日常开发中所讲的模块组件拆分,而是能够独立闭环自成体系的一个业务单元。这样在项目过程中除了部分组件间数据传递需要做预先约定外,前端同学仅仅只需要专注于自己所负责的交互场景即可。 以圈子模块主页为例,根据设计稿我们将它拆分为了三个独立的业务模块: 圈子信息模块、信息流模块和浮层组件模块,

一张图看懂linux内核中percpu变量的实现

社会主义新天地 提交于 2021-01-04 15:03:00
我们在使用各种编程语言进行多线程编程时,经常会用到thread local变量。 所谓thread local变量,就是对于同一个变量,每个线程都有自己的一份,对该变量的访问是线程隔离的,它们之间不会相互影响,所以也就不会有各种多线程问题。 正确的使用thread local变量,能极大的简化多线程开发。所以不管是c/c++/rust,还是java/c#等,都内置了对thread local变量的支持。 但你知道吗,不仅是在编程语言中,在linux内核中,也有一个类似的机制,用来实现类似的目的,它叫做percpu变量。 percpu变量,顾名思义,就是对于同一个变量,每个cpu都有自己的一份,它可以被用来存放一些cpu独有的数据,比如cpu的id,cpu上正在运行的线程等等,因该机制可以非常方便的解决一些特定问题,所以在内核编程中被广泛使用。 好奇的你们肯定都在问,它是怎么实现的呢? 我们先不管细节,先来看一张图,这样从全局的角度来了解下它的实现。 从上图中我们可以看到,各种源文件中通过DEFINE_PER_CPU的方式,定义了很多percpu变量,这些变量根据vmlinux.lds.S中的相关定义,会被linker聚合在一起,然后放到最终vmlinux文件的,一个名叫.data..percpu的p里。 这些变量的地址也是被特殊处理过的,它们从零开始依次递增,这样一个变量的地址

就是要你懂Java中volatile关键字实现原理

偶尔善良 提交于 2021-01-01 19:35:04
原文地址http://www.cnblogs.com/xrq730/p/7048693.html,转载请注明出处,谢谢 前言 我们知道volatile关键字的作用是保证变量在多线程之间的可见性,它是java.util.concurrent包的核心,没有volatile就没有这么多的并发类给我们使用。 本文详细解读一下volatile关键字如何保证变量在多线程之间的可见性,在此之前,有必要讲解一下CPU缓存的相关知识,掌握这部分知识一定会让我们更好地理解volatile的原理,从而更好、更正确地地使用volatile关键字。 CPU缓存 CPU缓存的出现主要是为了解决CPU运算速度与内存读写速度不匹配的矛盾 ,因为CPU运算速度要比内存读写速度快得多,举个例子: 一次主内存的访问通常在几十到几百个时钟周期 一次L1高速缓存的读写只需要1~2个时钟周期 一次L2高速缓存的读写也只需要数十个时钟周期 这种访问速度的显著差异,导致CPU可能会花费很长时间等待数据到来或把数据写入内存。 基于此,现在CPU大多数情况下读写都不会直接访问内存(CPU都没有连接到内存的管脚),取而代之的是CPU缓存,CPU缓存是位于CPU与内存之间的临时存储器,它的容量比内存小得多但是交换速度却比内存快得多。而缓存中的数据是内存中的一小部分数据,但这一小部分是短时间内CPU即将访问的,当CPU调用大量数据时

ubuntu16.04安装matlab2016b

試著忘記壹切 提交于 2020-12-06 18:33:54
一、matlab2016b版本下载 在ubuntu下安装matlab2016b,需要三个文件,分别是:Matlab+2016b+Linux64+Crack.rar 、R2016b_glnxa64_dvd1.iso 和 R2016b_glnxa64_dvd2.iso,文件比较大,可以从这个 百度网盘 里获取,提取码是46cx。 二、安装过程记录 1.解压 解压前,我下载的源码包的三个文件放入/home/ttwang/software/matlab下 rax Matlab+2016b+Linux64+Crack.rar 执行该命令后,终端显示界面及源码包目录下解压后的文件: 2.挂载dvd1.iso 建立挂载文件夹 /home/ttwang/matlab2016 mkdir /home/ttwang/matlab2016 然后挂载dvd1.iso文件 sudo mount -t auto -o loop /home/ttwang/software/matlab/R2016b_glnxa64_dvd1.iso /home/ttwang/matlab2016/ 如果挂载成功,将出现挂载目录,其内容如下图: 3.安装 我们能够看到,在挂载目录下有个 install 文件,我们返回当前的目录的上一级进行安装: cd ../ sudo /home/ttwang/matlab2016

被 C# 的 ThreadStatic 标记的静态变量,都存放在哪里了?

陌路散爱 提交于 2020-11-26 13:55:42
一:背景 1. 讲故事 前几天公号里有一位朋友留言说,你windbg玩的溜,能帮我分析下被 ThreadStatic 修饰的变量到底存放在哪里吗?能不能帮我挖出来????????????,其实这个问题问的挺深的,玩高级语言的朋友相信很少有接触到这个的,虽然很多朋友都知道这个特性怎么用,当然我也没特别研究这个,既然要回答这个问题,我得研究研究回答之!为了更好的普适性,先从简单的说起! 二:ThreadStatic 的用法 1. 普通的 static 变量 相信很多朋友在代码中都使用过 static 变量,它的好处多多,比如说我经常会用 static 去做一个进程级缓存,从而提高程序的性能,当然你也可以作为一个非常好的一级缓存,如下代码: public class Test { public static Dictionary<int, string> cachedDict = new Dictionary<int, string>(); } 刚才我也说到了,这是一个进程级的缓存,多个线程都看得见,所以在多线程的环境下,你需要特别注意同步的问题。要么使用锁,要么使用 ConcurrentDictionary,我觉得这也是一个思维定式,很多时候思维总是在现有基础上去修补,去亡羊补牢,而没有跳出这个思维从根基上去处理,说这么多是什么意思呢?我举一个例子: 在市面上常见的链式跟踪框架中

图解Linux是如何进行函数调用的?

断了今生、忘了曾经 提交于 2020-10-29 05:08:18
先抛出几个问题: 进程虚拟地址空间是如何分布的? 函数调用的栈帧结构是什么样子? 函数调用涉及到的寄存器都起了什么作用? 函数参数是如何传递的?传递顺序如何? 函数的返回值是如何传递的? 如果您对上述问题有些困惑,请继续往下看吧! 进程的内存布局 如图: 高地址的一部分空间会分配给内核,称为内核空间,剩下的内存空间给用户使用,称为用户空间。 用户空间中有几个 主要的内存区域 : 栈: 用于维护函数调用的上下文,离开了栈,函数调用就没法实现,栈通常在用户空间的最高地址处分配,通常有数兆字节的大小。 堆: 堆用来容纳程序动态分配的内存区域,程序中malloc或new分配的内存就来自堆里。堆通常存在于栈的下方(低地址方向),在某些时候,堆也可能没有固定统一的存储区域,堆一般比栈大很多,可以有百兆甚至几G的大小。 动态链接库映射区: 这个区域用于映射装载的动态链接库,Linux下如果可执行文件依赖其它共享库,那系统就会在这个区域分配相应空间,并将共享库装入该空间。 可执行文件映像: 存储着可执行文件在内存里的映像,由装载器在装载时将可执行文件的内存读取或映射到这里。 保留区: 保留区并不是一个单一的内存区域,而是堆内存中受到保护而禁止访问的内存区域的总称,例如在大多数操作系统里,极小的地址通常都是不允许访问的,如NULL,通常C语言将无效地址赋值为0也是出于这个考虑

独家|【云+端】战略发布,助力快速上云

谁说胖子不能爱 提交于 2020-10-28 18:00:59
2020 是神奇的一年,而最神奇的是,我们在这一年,实现了从前端 2.0 到 3.0 的迈进。云栖大会上,阿里云宣布 Serverless 2.0 Plus,与淘系技术全面共建,称将整合集团所有相关力量,确保 “云端一体” 战略全面落地 关注 【淘系技术】 微信公众号,后台回复: 923 ,即可获取全部PPT内容以及视频资料 前言 如今不再是传统的前端开发时代,云 + 端赋予了前端新的能力,新的使命。从传统的服务,到如今的多端,从 Web 、H5 到小程序,亦或者从线下走上云端,前端始终走在业务和技术的浪潮之巅,在这其中,技术总是在迭代和变革,也总是会有不同的声音以及对应的问题。 你是否在传统开发和 Serverless 中犹豫不决,对上云抱有怀疑?是否在开发项目的前端代码和后端代码中切换觉得特别繁琐?是否在开发中后台时觉得能力不足,需要申请服务器配合?是否在小程序开发中碰到资源调用,管理繁琐的问题? 淘系前端技术,我们即将开放新能力,让这些问题都得到解答,就来拭目以待吧。 云和端的生态本来就是一体的,以前有组织隔阂,就会有撕裂和损耗,而如今,云端一体,再也不需要分割。 云 + 端的定位 淘系前端负责人——姜凡(花名:展炎) 带来了他的想法。 在展炎的眼里,前端的知识体系已经到了第二个阶段,从 PC 场景已经变革到了多端的场景。如今,我们需要思考,前端如何从 2.0 迈入未来的 3

黑客与宕机

柔情痞子 提交于 2020-10-26 08:30:00
云栖号资讯:【 点击查看更多行业资讯 】 在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 阿里妹导读:造成系统异常宕机(无响应、异常重启)的原因有很多种,最常见的是操作系统内部缺陷和设备驱动缺陷。本文作者将和大家分享内存转储分析的底层逻辑和方法论,并通过一个线上真实案例来展示从分析到得出结论的整个过程,希望对同学们处理此类问题和对系统的理解上有所帮助。 相信凡是与计算机高频亲密接触的人,都遇到过系统无响应,或突然重启的情况。这样的情况如果发生在客户端设备,如手机,或者笔记本电脑上,且不是频繁出现,基本上我们的解法就是鸵鸟算法,即默默重启设备,然后继续使用,当作什么都没发生过。 但是,如果这样的问题发生在服务端,比如运行微信、微博后台程序的虚拟机或者物理机上,那往往会产生相当严重的影响。轻则导致业务中断,重则导致业务长时间无法工作。 大家都知道,驱动这些计算机的是运行在其上的操作系统,如 Windows 或者 Linux 等。系统异常宕机(无响应、异常重启)的原因有很多种,但总体来看,操作系统内部缺陷,或者设备驱动缺陷是最常见的两类原因。 从根本上解决这类问题“唯一正确”的方法,是操作系统内存转储分析(Memory Dump Analysis)。内存转储分析属于高阶的软件调试能力,需要工程师有丰富且全面的系统级别理论知识和大量的疑案破解似的上手实践经验。

吹爆!阿里内部疯传:“性能怪兽”Nginx+Redis高阶文档开源分享!

跟風遠走 提交于 2020-10-21 13:41:18
前言 在开源界, 高性能服务的典型代表就是Nginx和Redis 。纵观这两个软件的源码,都是非常简洁高效的,也都是基于异步网络IO机制的,所以对于要学习高性能服务的程序员或者爱好者来说,研究这两个网络服务的源码是非常有必要的。 Nginx目前市面上的书籍很多,但是Redis确实寥寥无几。这几年Redis已经发展到了5.0版本,这些特性暂时没有资料进行系统讲解。今天要与大家介绍的文档就弥补了这一空缺,可以帮助大家仁深入理解Redis内核实现机制的有效途径。下面我们来看看主要内容:(由于篇幅限制就只能以截图方式展示出来了,需要获取高清版PDF的朋友只需要点赞文章,关注我后文末有免费获取方式) 第一份:Redis源码解析 第1章引言 Redis简介 Redis 5.0的新特性 Redis源码概述 Redis安装与调试 第2章简单动态字符串 数据结构 基本操作 第3章跳跃表 简介 跳跃表节点与结构 基本操作 跳跃表的应用 第4章压缩列表 压缩列表的存储结构 结构体 基本操作 连续更新 第5章字典 基本概念 Redis字典的实现 基本操作 字典的遍历 API列表 第6章整数集合 数据存储 基本操作 第7章quicklist的实现 quicklist简介 数据存储 数据压缩 基本操作 第8章Stream Stream简介 Stream底层结构listpack的实现