2 Jeff_

尚未进行身份认证

面向Google和StackOverflow编程的小学生。

等级
TA的排名 1w+

What is a coroutine?

什么是协程随着coroutine ts正式进入c++20,c++已经进入协程时代了。c++20提供的无栈协程,拥有许多无与伦比的优越性,比如说没有传染性,可以与以前非协程风格的代码并存,再比如说不需要额外的调度器,总之是个好东西,我们首先需要知道,什么是协程?“协程”一词由两个词组成: “co” (cooperative ) 和 “routines” (functions)。协程是协作的功能...

2020-03-28 13:52:12

为什么要在C ++ 11中使用“override”说明符?

如果您知道Java,那么您可能已经很熟悉Java了,这对您来说可能是完全简单的@Override annotation。如果您一直使用C / C ++进行编码,那么这可能是新的。您可能会问自己一个问题,为什么在不必要的时候为什么要放一个额外的说明符。您的代码将以相同的方式工作。虽然在大多数情况下,代码的行为是不会改变的,但在其他情况下(实际上是在犯错误时),使用override会阻止您检查错误的...

2020-03-27 23:16:14

Data structure alignment (数据结构对齐 / 内存对齐)

开篇的话在比较老的编译器里,如果没有对变量取地址的操作,那么有些局部变量是通过寄存器保存的,不占栈上内存,根本不存在内存中如何排列的问题,比如TurboC 2.0这种。在一些较新的编译器里,局部变量排列顺序并不是从上到下一次排列,有些是根据使用频率来排列的,这样可以降低cache的miss率,所以怎么排列完全根据使用频率。大部分主流编译器的局部变量地址确实是从下到上,但也有反过来...

2020-03-23 01:08:15

Linux搭建自己编译的工程

自己编写Makefile (工程简单)apt-get install make安装make工具。Makefile 主要的 5个部分 (显示规则, 隐晦规则, 变量定义, 文件指示, 注释)显示规则 :: 说明如何生成一个或多个目标文件(包括 生成的文件, 文件的依赖文件, 生成的命令)隐晦规则 :: make的自动推导功能所执行的规则变量定义 :: Makefile中定义的变量文件指...

2020-03-21 23:08:51

辗转相除法(Euclidean algorithm / 欧几里得算法)

在数学中,辗转相除法,又称欧几里得算法(英語:Euclidean algorithm),是求最大公约数的算法。两个整数的最大公约数是能够同时整除它们的最大的正整数。辗转相除法基于如下原理:两个整数的最大公约数等于其中较小的数和两数相除余数的最大公约数。例如,252和105的最大公约数是21(252=21*12;105=21*5);因为 252 − 105 = 21 × (12 − 5) = ...

2020-03-21 16:08:45

KISS principle (kiss原则)

Keep It Simple Stupid (KISS)原则声明即使解决方案看起来很愚蠢,简单的解决方案也比复杂的解决方案好。描述该KISS原则是关于追求简单。现代编程语言,框架和API具有强大的手段来创建针对各种问题的复杂解决方案。有时,开发人员可能会想编写使用所有这些复杂功能的“聪明”解决方案。该KISS原则指出,一个解决方案是更好的时候,使用更少的继承,多态少,少类等。遵循KISS...

2020-03-21 15:26:04

程序执行中的地址分配

EXE文件的运行机制EXE文件作为本地代码的程序,并没有指定变量及函数的实际内存地址。在类似于Windows操作系统这样的可以加载多个可执行程序的运行环境中,每次运行时,程序内的变量及函数被分配到的内存地址都是不同的。那么,EXE文件中,变量和函数的内存地址的值,是如何来表示的呢?下面就让我们来揭晓答案。那就是EXE文件中给变量及函数分配了虚拟的内存地址。 在程序运行时,虚拟的内存地址回转换成...

2020-03-12 23:23:39

CPU、内存、寄存器相关基础知识

计算机内部是由IC(Intergrated circuit,集成电路,其由很多晶体管组成)这种电子部件构成的。CPU和内存就是IC的一种。IC的一个引脚只能表示两个状态,因此计算机的信息只能用二进制来处理。CPU是什么从功能来看,CPU内部由寄存器、控制器、运算器和时钟四个部分构成,各部分之间由电流信号相互连通。寄存器可以暂存指令、数据等处理对象,可以将其看成内存 的一种。控制器负责把...

2020-03-11 22:34:35

Compare-and-swap(CAS无锁算法)

锁的优缺锁是用来做并发最简单的方式,当然其代价也是最高的。内核态的锁的时候需要操作系统进行一次上下文切换,加锁、释放锁会导致比较多的上下文切换和调度延时,等待锁的线程会被挂起直至锁释放。在上下文切换的时候,cpu之前缓存的指令和数据都将失效,对性能有很大的损失。操作系统对多线程的锁进行判断就像两姐妹在为一个玩具在争吵,然后操作系统就是能决定他们谁能拿到玩具的父母,这是很慢的。用户态的锁虽然避免了...

2020-03-08 23:08:12

Cache replacement policies(缓存替换策略)/ LRU 和 LFU等算法

缓存是一个计算机思维,对于重复的计算,缓存其结果,下次再算这个任务的时候,不去真正的计算,而是直接返回结果,能加快处理速度。当然有些会随时间改变的东西,缓存会失效,得重新计算。在计算中,缓存算法(通常也称为缓存替换算法或缓存替换策略)是优化指令或算法,计算机程序或硬件维护的结构可以利用这些指令或算法来管理存储在计算机上的信息缓存。高速缓存通过将最近或经常使用的数据项保存在比普通内存存储区更快或更...

2020-03-08 21:36:49

Windows记事本编码反汇编分析

转载自:liam.page网上有一个流传多年的段子。这个段子大致是说,若你在简体中文版本的 Windows 系统下,用系统自带的记事本程序,以默认的 ANSI 编码保存「联通」两个字,那么重新打开后「联通」二字就消失了。如果我没记错的话,还曾有好事者据此编排,认定 Windows 背后的微软和联通有仇,故意不让联通二字正常显示。当然,这个说法肯定是假的。但是这一现象背后的原因究竟是什么呢?...

2020-03-08 18:01:17

Skip List(跳表)

转载自:lotabout.me正文跳表(skip list) 对标的是平衡树(AVL Tree),是一种 插入/删除/搜索 都是 O(log n) 的数据结构。它最大的优势是原理简单、容易实现、方便扩展、效率更高。因此在一些热门的项目里用来替代平衡树,如 redis, leveldb 等。跳表的基本思想首先,跳表处理的是有序的链表(一般是双向链表,下图未表示双向),如下:这个链表中,如...

2020-03-07 19:28:51

Big-endian and Little-endian (大小端)

字节序(Endianness)在计算中,字节序是指数字的二进制表示形式中字节(或有时是位)的顺序。它也可以更一般地用于指代任何表示形式的内部排序,例如数字系统中的数字或日期的各个部分。在最常见的用法中,字节顺序表示多字节数字中字节的顺序。big-endian顺序将最高有效字节排在最前面,最低有效字节排在最后,而little-endian的顺序则正好相反。例如,考虑无符号十六进制数0x1234,...

2020-03-07 16:58:28

Bit Tricks (位运算技巧)

技巧? 是的,你没有看错!聪明的程序员总是喜欢这种东西。一点点让我的生活变得如此轻松,以至于我总是喜欢谈论它们!如果您不熟悉它或感到困难,那么不用担心,您来对地方了!本文旨在使您的旅途更轻松。相信我,您一定会喜欢这篇文章。因此,让我们开始吧!位?这些是什么?好吧,对于某些人来说,它是0和1,即二进制数字。直到一天以前,我都一直有这种感觉,我们的一位教授告诉我们,他们具有特殊的含义。二进制数字0...

2020-02-26 22:55:43

type_traits 类型萃取

一、 c++ traitstraits是c++模板编程中使用的一种技术,主要功能:把功能相同而参数不同的函数抽象出来,通过traits将不同的参数的相同属性提取出来,在函数中利用这些用traits提取的属性,使得函数对不同的参数表现一致。traits是一种特性萃取技术,它在Generic Programming中被广泛运用,常常被用于使不同的类型可以用于相同的操作,或者针对不同类型提供不...

2020-02-15 14:57:47

代码的抽象三原则

软件开发是"抽象化"原则(Abstraction)的一种体现。所谓"抽象化",就是指从具体问题中,提取出具有共性的模式,再使用通用的解决方法加以处理。最近,我读到美国程序员Derick Bailey的一篇文章,谈到"抽象化"应该遵循的三个原则,觉得很有启发。一、DRY原则DRY是 Don’t repeat yourself 的缩写,意思是"不要重复自己"。软件工程名著《The Prag...

2020-02-14 19:13:09

临时变量生命期

有关临时对象的生命周期有三种情况:一般情况:临时性对象的被摧毁,应该是对完整表达式(full-expression)求值过程中的最后一个步骤。该完整表达式造成临时对象的产生。以及两个特殊情况凡含有表达式执行结果的临时性对象,应该存留到object的初始化操作完成为止。如果一个临时性对象被绑定于一个reference,对象将残留,直到被初始化之reference的生命结束,或直到临时对...

2020-02-09 18:37:16

锁(Lock)、内存屏障(Memory barrier)与 缓存一致性( Cache coherence)

在应用层,关于锁的使用大家应该都很熟悉了,作用就是为了保护共享变量不被同时操作而导致无法预测的情况。然而深入到具体实现,锁仅仅只是锁定临界区吗?锁的实现其实还必须实现一个语义,也就是内存屏障。内存屏障主要用于防止指令重排而导致的无法预测的情况。代码经过编译器生成的指令并不一定都是按着我们原先的想法来生成的,可能经过优化等情况进行了指令的重排,然而这些重排在执行后的结果应当是一致的。其实及时编译器...

2020-02-07 21:27:04

Atomic Operations (standardized memory model)

C ++规范未引用任何特定的编译器,操作系统或CPU。它引用了 abstract machine 抽象机,它是对实际系统的概括。在语言规范中,程序员的工作是为抽象机编写代码。编译器的工作是在具体机器上实现该代码。通过严格按照规范进行编码,可以确定您的代码可以在不使用兼容C ++编译器的任何系统上进行编译和运行,而无论是现在还是50年后。C ++ 98 / C ++ 03规范中的抽​​象机基本上...

2020-02-07 21:02:24

constexpr关键字

constexpr是C++11引入的关键字,为什么在有const关键字的基础上要引入constexpr呢?它们二者有什么区别呢?简介C++编译时可确定常量表达式的结果,因此可在编译时优化。C++规范在一些地方要求使用常量表达式,如声明数组的维数。但常量表达式不允许包含函数调用或者对象构造。因此下述代码无效:int get_five() {return 5;}int some_value[...

2020-02-06 17:58:05

查看更多

勋章 我的勋章
  • GitHub
    GitHub
    绑定GitHub第三方账户获取
  • 脉脉勋章
    脉脉勋章
    绑定脉脉第三方账户获得
  • 签到新秀
    签到新秀
    累计签到获取,不积跬步,无以至千里,继续坚持!
  • 持之以恒
    持之以恒
    授予每个自然月内发布4篇或4篇以上原创或翻译IT博文的用户。不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
  • 勤写标兵Lv2
    勤写标兵Lv2
    授予每个自然周发布4篇到6篇原创IT博文的用户。本勋章将于次周周三上午根据用户上周的博文发布情况由系统自动颁发。