计算机学科基础
文章平均质量分 82
图王大胜
一名Android FWK程师;专注系统思维
展开
-
[C++11] 外部模板机制
说明:C++11 新特性中的外部模板(Explicit Instantiation Declaration)是一种机制,允许开发者在非模板定义的源文件中明确地声明或定义模板实例。这样做的主要目的是为了避免在多个编译单元中重复编译模板代码,从而减少编译时间和潜在的编译错误。外部模板的声明告诉编译器,模板的某个具体实例应该在某个特定的编译单元中生成,而不需要在每个包含模板声明的编译单元中都进行实例化。这通常用于库的实现中,以确保模板代码只被编译一次。在这段代码中,MyClass是一个模板类,我们通过。原创 2024-08-16 19:53:55 · 635 阅读 · 0 评论 -
[C++11] 变长参数模板
说明:C++11 引入了可变参数模板(Variadic Templates)这一功能,也称为变长模板参数。它允许创建可以接受任意数量参数的模板函数或类。args...这个示例展示了可变参数模板的强大功能,可以用来实现类似 printf 这样的可变参数函数。通过递归调用的方式,可以处理任意数量和类型的参数。原创 2024-08-15 00:15:00 · 1065 阅读 · 0 评论 -
[C++11] 模板函数的默认模板参数
说明:C++11 引入了模板函数的默认模板参数这一特性。在定义模板函数时,可以为其模板参数指定默认值。这样在调用该模板函数时,如果调用者没有显式提供某个模板参数,编译器就会使用该参数的默认值。接下来直接上例子感受下,myFunction 是一个模板函数,它有两个模板参数 T 和 U。T 的默认类型是 int,U 的默认类型是 double。通过使用默认模板参数,开发者可以更加灵活地使用模板函数,而无需在每次调用时都显式提供所有模板参数。这提高了代码的可读性和可维护性。原创 2024-07-16 16:39:35 · 766 阅读 · 0 评论 -
[C++11] 退出清理函数(quick_exit && at_quick_exit)
说明:在C++11中,quick_exit和是新增的快速退出功能,用于在程序终止时提供一种快速清理资源的方式。原创 2024-07-02 20:34:42 · 712 阅读 · 0 评论 -
[C++] 退出清理函数解读(exit、_exit、abort、atexit)
退出相关函数说明:在C++中,exit_exit(或_Exit)、abort和atexit是用于控制程序退出和清理的标准库函数。原创 2024-07-02 19:51:54 · 1457 阅读 · 0 评论 -
[C++11] noexcept 完整解析
是C++11标准引入的一个关键字,用于指示一个函数是否被保证不会抛出异常。如果但从设计角度看会感觉很奇怪,明明是有问题才抛出异常,那为什么还是在某些时候禁止抛异常呢?接下来我们了解下C++11 为什么引入了noexcept关键字?原创 2024-07-01 20:48:39 · 3091 阅读 · 0 评论 -
数据结构递归(01)汉诺塔经典问题
有一个三脚架,上面有三个从下到上依次递减的圆盘,总共有n个圆盘,这些圆盘最初都放在第一个柱子上,并且每个圆盘上都有不同的大小,使得较大的圆盘不能放在较小的圆盘上面。递归的深度是n-1,因为每次移动n-1个圆盘,然后是第n个圆盘,再是n-1个圆盘。总共需要进行2^n - 1次移动才能完成n个圆盘的汉诺塔问题。这个过程可以继续递归地应用到n-1个圆盘上,直到n为1,这时问题就变得非常简单,只需将圆盘直接移动到目标柱子上。汉诺塔(Hanoi Tower)问题是一个经典的递归问题,起源于一个关于印度的传说。原创 2024-07-01 20:01:11 · 542 阅读 · 0 评论 -
C++11 内存布局术语解读(平凡类型、平凡可复制类型、标准布局类型)
说明:在C++11中,平凡类型(Trivial Type)、平凡可复制类型(TrivialCopyable)、标准布局类型(Standard-layout Type)是描述类在内存中布局特性的术语,它们与类的构造、拷贝、赋值和销毁行为有关,也影响着类的内存布局和对齐方式。下面用通俗的语言解释这些概念:平凡类型:指那些在内存中的行为非常简单的类。它们的构造函数、析构函数、拷贝构造函数和赋值运算符都没有自定义实现,完全由编译器提供的默认行为即可。原创 2024-04-23 11:40:11 · 1356 阅读 · 0 评论 -
[C++] 内存布局完整解读
右值引用和移动语义:虽然这些特性主要影响临时对象的处理和函数参数的传递,但它们也可能间接影响内存布局,因为它们允许更高效的资源转移和避免不必要的复制。总之,C++11在内存布局方面提供了更多的控制和标准化,使得开发者能够更精确地管理数据结构在内存中的排列,同时也提高了代码的可移植性和性能。继承和多重继承:在多重继承中,基类的数据成员会先于派生类的数据成员排列,且每个基类的数据成员会按照它们在基类中的顺序排列。统一的内存对齐模型:C++11提供了跨编译器和平台的一致内存对齐模型,这有助于提高代码的可移植性。原创 2024-04-19 23:54:07 · 1914 阅读 · 2 评论 -
[C++] 内存对齐完整解读
说明:内存对齐是指按照特定的规则来组织数据在内存中的排列方式,以提高内存访问的效率。在计算机系统中,内存对齐可以减少CPU访问内存时所需的总周期数,因为许多硬件平台只能从某些特定地址(如2的幂次方)开始读取数据。内存对齐是确保数据的地址是其大小的倍数,这通常可以提高程序的性能,特别是在需要频繁访问数据的情况下。在C++11之前,编译器提供了一些特定的扩展或者特定的编译器指令来实现内存对齐,这些指令通常是编译器特定的。以下是一些在C++11之前常用的内存对齐方法:在MSVC中,可以使用。原创 2024-04-19 20:38:13 · 1192 阅读 · 0 评论 -
[C++11] static_assert完整解读
是 C++11 标准中引入的一个特性,它允许在编译时对某些条件进行检查。如果条件不成立,编译器将产生一个编译错误。这个特性主要用于静态类型检查,确保程序在编译时就满足某些条件。接下来我们了解下C++11 为什么引入了 static_assert 断言?,以及static_assert和C++之前的标准中assert断言之间的差异及优劣势到底是什么。原创 2024-04-18 23:46:53 · 1626 阅读 · 0 评论 -
[C++11] 基础类型扩展解读(long long、char16_t && char32_t)
long long是一种基本数据类型,它通常是一种至少64位的有符号整数类型。在C++中,long long类型能够存储的数值范围远远超过int或long类型,这使得它非常适合存储非常大的整数。char16_t和char32_t是C++11标准引入的两种新的数据类型,它们用于支持Unicode字符集。原创 2024-04-18 20:42:25 · 2176 阅读 · 0 评论 -
[C++11] 枚举新特性完整解析
说明:C++11 关于新枚举的引入,主要有以下几个方面:强类型枚举(enum class):这是一种新的枚举类型,它提供了更强的类型检查。枚举类成员的底层类型:在枚举类中,可以明确指定枚举成员的底层整数类型。自动枚举值:这个特性允许枚举成员自动从 0 开始赋值,并且依次递增。枚举类型的字面量:枚举类型可以作为编译时常量使用,这使得枚举值可以在模板元编程和编译时决策中发挥作用。原创 2024-04-15 20:08:10 · 2515 阅读 · 2 评论 -
[C++11] 初始化语法、explicit关键字、final && override关键字、delete && default关键字
C++11 引入了列表初始化(List-initialization)的概念,允许开发者使用花括号 {} 来初始化对象。这种方式不仅适用于基本类型和容器,也适用于自定义类型。列表初始化提供了一种统一的语法,使得初始化过程更加直观和一致。原创 2024-04-11 20:11:12 · 538 阅读 · 0 评论 -
[C++11] nullptr完整解析
nullptr是 C++11 引入的一个新特性,它表示一个空指针,用于替代之前使用的NULL。接下来我们看看到底为什么要引入nullptr。原创 2024-04-11 19:46:02 · 2217 阅读 · 0 评论 -
[C++11] 理解委托构造函数
说明:委托构造函数是 C++11 引入的一种特殊类型的构造函数,它通过调用同一个类中的另一个构造函数来初始化对象。这种构造函数在声明时使用符号后跟其他构造函数的初始化列表,而不是在函数体内调用。委托构造函数的主要目的是避免代码重复,并简化多个构造函数之间的共同初始化逻辑。注意:这里所谓的性能提升本质上是减少了成员变量初始化的时间,在一些大型工程中,成员变量初始化往往是很大的,因此要做这样的优化。原创 2024-04-05 20:23:43 · 1389 阅读 · 0 评论 -
[C++11] 理解继承构造函数
说明:继承构造函数是 C++11 引入的一个特性,它允许派生类(derived class)通过简单的声明来继承一个或多个基类(base class)的构造函数。这意味着派生类可以直接使用基类的构造函数来初始化其继承的基类部分,而不需要在派生类中显式地重写或复制这些构造函数的初始化代码。这个特性的主要目的是减少代码重复,并提高代码的可读性和可维护性。通过继承构造函数,派生类可以清晰地表明它继承了基类的哪些构造函数,这使得类的继承关系更加明确。原创 2024-04-05 19:39:33 · 1741 阅读 · 0 评论 -
[C++11] 移动语意和移动构造函数
说明:移动语义(Move Semantics)是 C++11 引入的一个重要概念,旨在提高大型对象(特别是那些涉及资源管理的对象)的复制效率。移动语义允许资源从一个对象“移动”到另一个对象,而不是进行昂贵的复制操作。这种机制通过右值引用(right-value reference)和移动构造函数(move constructor)以及移动赋值操作符(move assignment operator)来实现。而移动构造函数是移动语义的一个重要组成部分。原创 2024-04-05 18:54:15 · 721 阅读 · 0 评论 -
[C++11] 理解右值引用及相关概念(左值与右值、std::move、完美转发)
右值引用是 C++11 引入的一种新的引用类型,它专门用来引用右值。右值引用使用 && 符号声明,它可以绑定到将要销毁的临时对象或右值。右值引用的主要目的是支持移动语义,这是一种资源管理技术,允许资源从临时对象转移到另一个对象,而不是进行复制。原创 2024-04-05 17:12:50 · 5317 阅读 · 10 评论 -
[C++] 拷贝构造函数 && 深拷贝、浅拷贝
说明:在C++中,拷贝构造函数是一个特殊的构造函数,它用于创建一个新对象,这个新对象是另一个同类型对象的副本。拷贝构造函数通常接受一个参数,这个参数是对另一个对象的引用,并且这个引用是一个常量引用,以确保不会通过拷贝构造函数修改原始对象的状态。这里的MyClass是类的名称,other是传递给拷贝构造函数的常量引用参数,表示要拷贝的对象。拷贝构造函数的主要作用主要有3个,包括:创建对象副本:当你需要根据一个已存在的对象创建一个新的对象时,拷贝构造函数非常有用。原创 2024-04-05 11:42:22 · 1002 阅读 · 0 评论 -
[C++11] decltype 完整解析
说明:decltype 是 C++11 引入的一个关键字,它的主要含义和概念是用于查询表达式的类型。decltype 能够推导出表达式的类型,包括所有的 cv-限定词(const、volatile)和引用限定词,但不包括表达式本身的值。这使得 decltype 成为模板元编程和类型推导中一个非常有用的工具。decltype 的一些关键点解读如下:表达式类型的推导:decltype 可以用来推导几乎任何表达式的类型,包括变量、函数调用、解引用操作符、成员访问等。原创 2024-04-02 15:13:33 · 921 阅读 · 0 评论 -
[C++11] constexpr 完整解析
constexpr是C++11标准引入的一个关键字,旨在支持编译时常量表达式的计算。constexpr的主要目的是提高程序性能,通过在编译时计算常量值来减少运行时的计算负担。这个特性使得程序员能够编写更加高效和可读的代码,并且能够利用编译器进行更多的优化。原创 2024-04-02 11:52:31 · 2314 阅读 · 0 评论 -
[C++11] 语言层面多线程完整解析
说明:C++11标准引入了一个新的线程库,这是C++历史上第一次在语言层面提供原生的并发编程支持。这个线程库主要包括了以下几个部分:std::thread:用于创建和管理线程。std::mutex 和 std::recursive_mutex:用于提供互斥锁,保护共享资源。std::lock_guard 和 std::unique_lock:用于简化互斥锁的管理。std::condition_variable:用于线程间的条件同步。std::async:用于异步执行函数和获取函数的返回值。原创 2024-04-02 09:23:07 · 934 阅读 · 0 评论 -
[C++11] Lambda表达式完整解析
说明:C++11中的Lambda表达式是一种允许创建匿名函数对象的语法结构。Lambda表达式可以捕获作用域中的变量,并且可以像普通函数一样被调用。它们是C++11标准中引入的一个重要特性,旨在提供一种方便的方式来定义内联的小型函数,特别适用于编写回调函数、线程任务、以及与STL算法结合使用的场景。在使用Lambda表达式前我们先了解下为什么引入Lambda表达式。原创 2024-04-01 15:35:47 · 821 阅读 · 0 评论 -
[C++11] auto关键字完整解析
auto 关键字在C++11中引入,用于类型推导,可以让编译器自动推断变量的类型。我们先来了解下为什么C++11引入auto关键字。原创 2024-04-01 15:18:27 · 895 阅读 · 0 评论 -
[C++] 类型转换操作符(static_cast、dynamic_cast、const_cast、reinterpret_cast)
说明:本文主要解释static_cast、dynamic_cast、const_cast、reinterpret_cast这几种类型转换操作符。接下来我们对每一个类型转换操作符进行详细说明并给出一些基本的使用方式,重在深入理解。在解释类型转换操作符之前,我们先了解下,为什么要引入类型转换操作符?C语言本身就支持请值类型转换,那么C++为什么还要引入类型转换操作符呢,其实C++中引入类型转换操作符的设计目的是为了增强类型安全性和程序可靠性。原创 2024-03-25 17:24:10 · 723 阅读 · 0 评论 -
[C++11] 智能指针(auto_ptr(弃用)、unique_ptr、shared_ptr、weak_ptr)详细解读
这里主要解释auto_ptr、unique_ptr、shared_ptr、weak_ptr这几种智能指针。接下来我们对每一个指针类型进行详细说明。在 C++ 中,auto_ptr、unique_ptr、shared_ptr 和 weak_ptr四种智能指针主要用于管理动态分配的对象的生命周期。它们在所有权管理和内存安全方面有所不同。原创 2024-03-20 22:11:49 · 1392 阅读 · 0 评论 -
计算机基础(07)密码学基础
密码算法本身要保密,要很安全,最开始的加密算法主要是:字母替换和顺序置换。消息摘要算法主要用于生成数据的"指纹",具有不可逆性。也被称为哈希/散列算法。消息摘要算法的主要特征是加密过程不需要密钥,且加密过程不可逆。常见摘要算法有MD5和SHA-1等。一致性验证:从网络上下载文件时,有的文件为防止篡改,会通过MD5生成一串字符串。下载后 可以在本地执行MD5再生成一个字符串来对比,确认文件的一致性。安全访问验证:在网站中,注册时提交的口令经过Hash计算后存入网站的数据库。原创 2022-10-17 17:12:22 · 2415 阅读 · 0 评论 -
OpenGL基础(20)可控的立方体-鼠标 源码&显示效果
说明:本系列视频使用 mac平台的Xcode来实现,windows平台和Linux平台与之类似。1程序功能简介这里显示了多个立方体,通过控制鼠标就可以调整多个立方体的视角。主要是通过实战 理解 鼠标输入与摄像机之间如何建立起联系。2程序代码-可控的立方体-鼠标2.1 核心源码源码如下所示:#include <glad/glad.h>#include <GLFW/glfw3.h>#include <iostream>#include...原创 2021-07-25 12:09:18 · 478 阅读 · 0 评论 -
OpenGL基础(19)可控的立方体-按键 源码&显示效果
说明:本系列视频使用 mac平台的Xcode来实现,windows平台和Linux平台与之类似。1程序功能简介这里显示了多个立方体,通过控制按键WSAD就可以调整多个立方体的视角。主要是通过实战 理解按键输入与摄像机之间如何建立起联系。2程序代码-可控的立方体们2.1 核心源码源码如下所示:#include <glad/glad.h>#include <GLFW/glfw3.h>#include <iostream>#include..原创 2021-07-25 11:25:33 · 419 阅读 · 0 评论 -
OpenGL基础(18)转动的摄像机 源码&显示效果
说明:本系列视频使用 mac平台的Xcode来实现,windows平台和Linux平台与之类似。1程序功能简介主要是通过实战 理解 LookAt矩阵。2程序代码-转动的摄像机2.1 核心源码源码如下所示:原创 2021-07-25 11:11:16 · 413 阅读 · 0 评论 -
OpenGL基础(17)摄像机
OpenGL本身没有摄像机的概念,但我们可以通过把场景中的所有物体往相反方向移动的方式来模拟出摄像机,这样感觉就像我们在移动,而不是场景在移动。1 摄像机LookAt矩阵建立定义一个摄像机,我们需要一个摄像机在世界空间中的位置、观察的方向、一个指向它的右测的向量以及一个指向它上方的向量。依据这4个信息,我们可以构建出一个LookAt矩阵。1.1 矩阵基本信息获取@1定义摄像机定义摄像机的位置,一个三维向量(0,0,3),如下所示:glm::vec3 cameraPos = glm.原创 2021-07-19 17:30:25 · 1704 阅读 · 0 评论 -
OpenGL基础(16) 多个立方体 源码&显示效果
说明:本系列视频使用 mac平台的Xcode来实现,windows平台和Linux平台与之类似。1程序功能简介主要是通过实战 理解 多个不同位置 绘制相同图形的流程。2程序代码-旋转立方体2.1 核心源码源码如下所示:#include <glad/glad.h>#include <GLFW/glfw3.h>#include <iostream>#include <learnopengl/filesystem.h>#i...原创 2021-07-18 20:01:23 · 521 阅读 · 0 评论 -
OpenGL基础(15) 旋转立方体 源码&显示效果
说明:本系列视频使用 mac平台的Xcode来实现,windows平台和Linux平台与之类似。1程序功能简介说明:一个动态旋转的立方体 的局部截图。该案例主要是通过实战 理解 深度测试。2程序代码-旋转立方体2.1 核心源码源码如下所示:#include <glad/glad.h>#include <GLFW/glfw3.h>#include <iostream>#include <learnopengl/filesyst...原创 2021-07-18 00:12:21 · 775 阅读 · 1 评论 -
OpenGL基础(14)四边形投影 源码&显示效果
说明:本系列视频使用 mac平台的Xcode来实现,windows平台和Linux平台与之类似。1程序功能简介主要是通过实战 理解 正射投影 和 透视投影。2程序代码-旋转四边形2.1 核心源码源码如下所示:#include <glad/glad.h>#include <GLFW/glfw3.h>#include <iostream>#include <learnopengl/filesystem.h>#includ...原创 2021-07-16 21:26:45 · 452 阅读 · 2 评论 -
OpenGL基础(13)旋转四边形 源码&显示效果
说明:本系列视频使用 mac平台的Xcode来实现,windows平台和Linux平台与之类似。1 程序功能简介主要是通过实战 理解矩阵与旋转的关系。2程序代码-旋转四边形2.1 核心源码源码如下所示:#include <glad/glad.h>#include <GLFW/glfw3.h>#include <iostream>#include <learnopengl/filesystem.h>#include &l..原创 2021-07-16 18:23:35 · 423 阅读 · 1 评论 -
OpenGL基础(12)图形变化与3D效果
1 向量、矩阵与图形变化的关系在研究图形动态变化 就要用到数学方面的知识,涉及向量、矩阵以及相关的混合运算。关于向量、矩阵的基础知识可以参考视频:可汗学院线性代数课程(免费)图形的缩放、旋转、平移基本操作以及 它们的组合操作 均是通过矩阵运算来实现。OpenGL没有自带任何的矩阵和向量知识,所以我们必须定义自己的数学类和函数。目前有一个易于使用,专门为OpenGL量身定做的数学库,那就是GLM。接下来专门使用GLM来实现各种向量、矩阵的操作。2 GLM库基本操作GLM(OpenGLMath.原创 2021-07-16 16:47:02 · 652 阅读 · 1 评论 -
OpenGL基础(11)双重纹理 源码&显示效果
说明:本系列视频使用 mac平台的Xcode来实现,windows平台和Linux平台与之类似。1 程序功能简介主要是通过实战 理解双重纹理。上图中的纹理由下面两张纹理混合各50%构成,如下:2程序代码-双重纹理2.1 核心源码#include <glad/glad.h>#include <GLFW/glfw3.h>#include <iostream>#include <learnopengl/filesystem.h&..原创 2021-07-15 18:56:28 · 681 阅读 · 0 评论 -
OpenGL基础(10)纹理四边形 源码&显示效果
说明:本系列视频使用 mac平台的Xcode来实现,windows平台和Linux平台与之类似。1 程序功能简介主要是通过实战 理解纹理。2程序代码-带纹理的四边形2.1 核心源码说明:对于纹理读图的库,选择的是stb_image库源码如下所示:#include <glad/glad.h>#include <GLFW/glfw3.h>#include <iostream>#include <learnopengl/file..原创 2021-07-15 18:03:42 · 563 阅读 · 0 评论 -
OpenGL基础(09)纹理
1 纹理(Texture)纹理是一个2D图片(也有1D和3D的纹理),可以用来添加物体的细节;可以理解为贴纸。纹理的意义在于可以让物体非常精细而不用指定额外的顶点。纹理坐标在x和y轴上,范围为0到1之间(前提是2D纹理图像)。使用纹理坐标获取纹理颜色叫做采样(Sampling)。纹理坐标起始于(0, 0),终于(1, 1),即从纹理图片的左下角到右上角。下图展示了把纹理坐标映射到三角形上的过程。如下所示:这里为三角形指定了3个纹理坐标点。我们希望三角形的左下角对应纹理的左下角,即三角...原创 2021-07-15 18:03:46 · 651 阅读 · 1 评论