自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(12)
  • 收藏
  • 关注

原创 git入门:commit的二义性 -- 从中学数学学习git

本文并不打算介绍如何使用git,也不会从源码和实现的角度去分析git,而是从设计理念的角度介绍git的相关概念,帮助大家更好的使用git。如果要具体学习相关命令,强烈推荐大家从这个网站开始学习。commit与数列求和我们知道,在软件开发中,会有许多不同的版本,每一个版本相对父版本都会有一定的改动。把改动累积起来会得到版本。这个过程和我们在中学中学过的某个概念非常相似–数列求和:求和数列时,会有多个an,把an累加起来会得到sn。这两个概念非常相似,也给了我们理解git工作方式的一个灵感。回到git

2021-11-10 15:08:14 295

原创 c++入门系列:pod类型

众所周知,虽然c++在一定程度上是c的超集,但c++和c有很大的不同,其中之一,就是c++的类和c的结构体有很大的区别。在c++中,如果一个类和c中的结构体相同,这样的类被称作pod(plain old data),可以通过std::is_pod检查一个类是否是pod类。下文会介绍pod的相关要求:pod的组成在c++,对于一个pod的类要满足那几条要求做了一个详细的概括,具体来说,is_pod可以拆分为is_trivial和is_standard_layout,is_trivial又可以拆分成is_t

2021-10-30 12:00:26 492

原创 c++入门系列:函数指针类型与函数类型的区别

以下是一个简单的例子,分别把成员函数指针的类型和函数指针的类型以及成员指针的类型做了一个比较。值得注意的是,由于普通的函数无法拷贝,在早期的语法中,并没有特意区分函数和函数指针,使得它们可以互相转换,但最好不要这么写。#include <type_traits>#include <iostream>struct foo{ int a; int dummy(void) { return 1; }};int dummy(void) { return 1;

2021-10-08 18:35:41 468

原创 OpenGL状态机设计思路剖析

概述学会一门图形api并不容易,除了图形学算法以外,还得花时间去理解图形api本身的架构。对于OpenGL而言,这个架构就是它的状态机模型,由于OpenGL版本的不断迭代,整个架构发生了一定的迭代,不同版本的api风格不一致,导致初学者更难入门。不过,如果能抓住一定的脉络,整个api的架构也会变得相当清晰。下文中,将会按照迭代的顺序,对OpenGL状态机架构的常见设计做一个阐述。buffer object和target在最早期的立即模式的OpenGL中,是不存在buffer object这个概念的。如

2021-09-13 11:47:54 644

原创 c++入门系列:怎么找到一个变量?

初次接触指针的同学可能会有一个疑问,指针指向了变量的地址,程序可以通过指针找到变量,那么,程序要怎么找到指针呢?是通过另一个指向指针地址的指针吗?如果是这样,那又怎么找到另一个指向指针地址的指针呢?会不会一直迭代下去,源头在哪里呢?事实上,这个问题并不难,只要对c++内存模型有一定的理解,很快就能想清楚这个问题。源头在栈区和静态变量区。静态变量区是源头很好理解,存在在静态变量区的对象的地址在编译期就被计算出来,是一个确定的值。在栈区的变量呢?事实上,在编译期可以计算出运行时栈顶的地址相对栈上变量地址的偏

2021-07-15 10:27:55 509

原创 差点骗过编译器的一段代码

最近写了一个比较复杂的算法,这个算法复杂在哪呢?有很多不同的index,index组成的数组的index,index组成的数组的index组成的数组的index,一眼看过去,虽然通过命名对不同的index做了区分,却还是很难分清楚,到底这个index对应哪个数组。基于这一点,我打算设计一个专属index类,让index静态的和所指向的数组静态绑定,大概是这样:#include <vector>template<std::vector<int> *ptr>struc

2021-07-09 09:22:12 136

原创 C++ 静态多态

多态是面向对象的基本思想。一般情况下,我们会采用虚函数和虚函数表的方式实现多态,也就是动态多态。但是,如果采用虚函数实现多态,会对代码的性能造成一定的影响。(查找虚函数表的开销其实不大,虚函数影响性能的主要原因是虚函数会影响内联和优化。)和常见的优化思路一样,把动态变为静态。很多代码实际上不需要到运行时才知道应该调用哪个虚函数,使用虚函数仅仅只是因为子类需要调用父类的虚函数。对于这种情况,我们不需要虚函数表,可以采用静态多态,一般通过crtp技术来实现静态多态。当然,在一些需求下,比如迭代的访问vect

2021-06-19 16:07:38 1227

原创 c++从返回值优化到右值

c++返回值优化与右值这篇博客一开始是想写c++左值和右值的区别,不过,c++发展到现在,左值和右值的区别已经成了一团乱麻,即使是在标准里,也是单独对每一个表达式去定义是左值还是右值,想要直接把左值和右值概括清楚还是比较麻烦的。所以,这篇博客暂时只讲返回值优化,并介绍返回值优化和右值的关系。返回值优化的基本情况考虑这样一种情况:定义一个对象,对这个对象进行一些操作后,再把这个对象用来初始化另一个对象。初始化完成后,这个对象不再被使用。例程如下:struct foo{};int main(){

2021-01-16 11:28:18 1814 3

原创 协程的初步理解

协程的初步理解这两天在网上看协程相关的知识,今天终于有了一个大概的理解。下面给出一个介绍:协程(coroutine)和例程(routine)在讨论协程时,往往把这个概念和例程做对比。例程就是我们通常意义下的函数。例程和协程的区别在于:当调用者调用被调用者时,如果是例程,只有当被调用者执行完毕后才能返回调用者;如果是协程,被调用者可以执行到一半就挂起并返回到调用者,同时,被调用者可以再次从挂起的地方重新执行。把协程和例程看作一个类为了更好的理解协程和例程,基于面向对象的思想,我们把协程和例程都看作

2020-12-07 15:46:11 409

原创 modern cmake的概念剖析

modern cmake的初步认识这篇文章主要介绍一些相关的概念,具体的语法建议去github上看相关例程。target是modern cmake的核心在cmake 3.0之前,cmake处于”全局变量满天飞,成功与否一把梭“的境地。为了改善社区用户的生态,在3.0后,开始逐步像modern cmake过渡,把cmake中的一切都视作target,而cmake需要设置的则是target的属性。这些属性包括target的编译间相关属性、链接间相关属性、以及target间的依赖关系。引用依赖和实现依赖

2020-12-04 10:12:00 1156

原创 c/c++宏展开规则

c/c++宏展开规则总体概述例子#表示生成字符串#后面只能跟宏参数##表示连接宏不能自引用先解析#再解析##先解析#和##再解析宏参数,最后展开宏最近利用visual studio 2019研究了一下宏展开的规则,作为宇宙第一IDE,非常好用,下面来总结一下学习成果。总体概述在举例分析之前,先对规则进行一个总体的概述。总的来说,宏展开的规则有以下几点:#表示生成字符串,将一个参数转换为一个字符串;##表示连接,将两个token连接成一个;宏不能自引用;先展开#,再展开##,再展开宏参数,最后

2020-10-28 11:40:42 3598

原创 c++学习记录整理

c++学习记录整理初学c++的一个学习记录,对c++运行思路的一个阐述。声明、定义和初始化在c++中,声明、定义和初始化是三种不同的概念。声明一个对象的含义是,把这个对象添加到符号表,告诉编译器这个对象是有效的,但是,还没有给这个对象分配具体的空间。定义一个对象的含义是,不但声明了这个对象,还给这个对象分配了具体的内存空间。初始化一个对象的含义是,不但定义了这个对象,还调用了这个对象的初始化函数,给这个对象赋予了具体的值。声明、定义和初始化是三个递进的过程。只声明不定义的情形主要有以下几种情

2020-08-08 23:35:46 205

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除