1 |
|
使用__asan_unpoison_memory_region屏蔽某处内存检查
__asan_unpoison_memory_region
是 AddressSanitizer (ASan) 库中的一个函数。ASan 是一个用于检测内存错误的工具,主要用于 C 和 C++ 程序开发者。__asan_unpoison_memory_region
的作用是标记一段内存区域为“未污染”状态,这意味着这段内存可以被访问且不会触发 ASan 的错误报告。
具体来说,这个函数通常用于以下场景:
- 在内存被分配后但未初始化之前,标记该区域为未污染,以便在初始化期间可以安全访问。
- 当程序知道某段内存区域将被合法访问时,预先标记该区域为未污染,以避免误报。
函数原型通常如下:
1 | void __asan_unpoison_memory_region(void *addr, size_t size); |
参数解释:
addr
:内存区域的起始地址。size
:内存区域的大小(以字节为单位)。
通过调用这个函数,开发者可以更精细地控制 ASan 的内存监控行为,减少误报,提高调试效率。
UTF编码内存角度比较.md
UTF-8、UTF-16 和 UTF-32 是三种不同的 Unicode 编码方式,它们在表示字符时占用的字节数各不相同。具体如下:
UTF-8:
- UTF-8 是一种可变长度的编码方式,每个字符占用 1 到 4 个字节。
- 具体字节数取决于字符的 Unicode 码点:
- U+0000 至 U+007F(基本拉丁字母)占 1 个字节。
- U+0080 至 U+07FF 占 2 个字节。
- U+0800 至 U+FFFF 占 3 个字节。
- U+10000 至 U+10FFFF 占 4 个字节。
UTF-16:
- UTF-16 也是一种可变长度的编码方式,每个字符占用 2 或 4 个字节。
- 具体字节数取决于字符的 Unicode 码点:
- U+0000 至 U+FFFF(基本多语言平面,BMP)占 2 个字节。
- U+10000 至 U+10FFFF(辅助平面)占 4 个字节(使用一对代理项,即高位代理项和低位代理项,每个占 2 个字节)。
UTF-32:
- UTF-32 是一种固定长度的编码方式,每个字符占用 4 个字节。
- 无论字符的 Unicode 码点是多少,每个字符始终占用 4 个字节。
总结:
- UTF-8:1 到 4 个字节,具体取决于字符。
- UTF-16:2 或 4 个字节,具体取决于字符。
- UTF-32:固定 4 个字节。
这三种编码方式各有优缺点。UTF-8 是最常用的编码方式,因其对 ASCII 字符的高效编码(仅占 1 个字节),节省空间且向后兼容 ASCII。UTF-16 在处理基本多语言平面字符时相对高效,但对于包括大量辅助平面字符的文本,可能会占用更多空间。UTF-32 最简单,但由于每个字符固定占用 4 个字节,通常会占用更多的存储空间。
tag dispatch
对于short类型来说,会优先匹配通用引用版本的重载,导致无法构造string
1 | namespace TagDispatch { |
使用TagDispath,来解决匹配的问题
1 | namespace TagDispatch { |
针对函数的构造函数,使用通用引用重载,主要解决思路是通过enable_if来限制模板的匹配
1 | class Person |
模板规则推导
模板推导规则
1 | template<typename T> |
SFINAE
SFINAE(Substitution Failure Is Not An Error)是 C++ 中的一个重要概念,主要用于模板编程。它的意思是,当模板参数替换导致错误时,编译器不会将其视为错误,而是会继续查找其他可能的匹配。这使得我们可以在模板中进行条件编译,选择合适的重载或特化
SFINAE 的优势
条件编译:可以根据类型特征选择不同的实现,增强代码的灵活性和可重用性。
避免编译错误:当模板参数替换导致错误时,编译器不会将其视为错误,而是继续查找其他匹配的模板。
类型安全:通过类型特征,可以确保只有符合条件的类型才能使用特定的模板实现。
SFINAE 是 C++ 模板编程中的一个强大工具,允许开发者根据类型特征选择合适的模板特化或重载。通过结合 std::enable_if 和类型特征,开发者可以编写更灵活和安全的代码。
电子书目录
渲染整理
开放世界的场景管理
1. 切成tile
2. 数据分级LOD
3. 根据天顶角,调整远平面,裁剪数据
游戏引擎分层架构
1. EditorLayer
2. FuntionLayer
1. Rendering
2. Animation
3. Camera
4. Physics
5. Script
3. ResourceLayer
4. CoreLayer
1. threadPoolManagement
2. memoryPool
3. mathLibrary
5. PlatformLayer
1. RHI
Renderable
1. shader
1. vs,fs
2. macro
2. RenderState
3. MVP
4. Texture
5. DrawImp
渲染效果
1. 前向渲染
1. PBR
2. 布林冯模型
2. 阴影shadowMap:
1. 根据相机的位置,对整个场景,绘制出深度图,表示光的可见性
2. 渲染时,将相机位置变化到光源位置,计算深度值与shadowmap进行比较,从而决定绘制的亮度
3. 楼的倒影
1. 矩阵楼块插入地面
2. 模板测试,只有地面和水才绘制
4. AO
5. 聚光灯效果
6. UV动画
技术点提炼
1. 楼块
1. 切成小块
2. 柔化圆角
3. 贴UV
2. 3d瓦片绘制
1. 瓦片的加载,与cache
2. 非实施例渲染,按材质进行分类渲染
3. 实例化渲染,动态计算lod进行渲染
3. 模型渲染
1. PBR渲染
2. 非PBR渲染
c++ 可变参数模板
可变模版参数(variadic templates)
可以对参数进行高度泛化,标识0到任意个数参数
两种展开形式
- 使用特化的终止函数结合递归
1 | #include <iostream> |
- 使用逗号表达式
初始化列表,通过初始化列表来初始化一个变长数组, {(printarg(args), 0)…}将会展开成((printarg(arg1),0), (printarg(arg2),0), (printarg(arg3),0), etc… ),最终会创建一个元素值都为0的数组int arr[sizeof…(Args)]
1 | template<class F, class... Args>void expand(const F& f, Args&&...args) |
initializer_list
为了编写处理不同数量实参的函数,如果参数类型相同,可以使用initializer_list, 如果实参类型不同,使用可变参数模板
1 | struct myclass { |