
语言
文章平均质量分 73
tkokof1
这个作者很懒,什么都没留下…
展开
-
[译]Lua编程技巧
这个原则((YAGNI原则))和你计划在将来添加的程序特性有关,该原则是 “You aren’t gonna need it(你不会需要它的)” 的缩写.你不应该在需求明确之前添加新的程序功能或者程序特性,任何新的程序特性其实都会对程序的扩展性产生限制,所以一个不必要的程序特性很可能会影响到之后新增的一些必要的程序特性,并且当程序特性需求不明确时,我们也很难定义该程序特性实际的开发内容和测试方法.相比较复杂代码,简单代码往往更优雅,更不易产生Bug, 同时也更方便构建扩展,程序员之间也经常会提起这两个原则(原创 2022-06-04 21:24:29 · 334 阅读 · 0 评论 -
Sweet Snippet 之 四则运算求值
本文简单介绍了一种四则运算求值的实现方法(基于语法分析)双栈算法可以实现四则运算的求值,但是扩展性比较低,更好的方式是基于语法分析来实现,整体大概包括以下几个步骤:词法分析语法分析语法树生成运算求值我们先来看词法分析:首先定义我们需要用到的词法类型:local token_type = { add = 1, -- '+' minus = 2, -- '-' mul = 3, -- '*' div = 4, -- '/' lbrace = 5,.原创 2022-01-28 14:17:26 · 741 阅读 · 0 评论 -
C++(UE4) Memory Management Review
以下是关于 C++(UE4) 内存管理的一点简单分享原始方式(Raw)malloc/free 是 C 中用于分配内存和释放内存的主要方式new/delete 是 C++ 中用于分配内存和释放内存的主要方式,除了内存管理之外, new/delete 还负责调用对象的构造函数和析构函数new[]/delete[] 是 new/delete 的数组形式比较重要的一点是, new/delete 等内存管理的调用一定要匹配,譬如调用了 new 就一定要调用 delete(而不能 不调用 delete.原创 2021-08-15 22:27:31 · 359 阅读 · 0 评论 -
Sweet Snippet 之 RingBuffer for UE4
本文简述了一种 环形缓冲区(ring buffer) 的实现方法环形缓冲区(ring buffer)在一些情况下非常有用, UE4 中提供了一个默认的实现 TCircularBuffer(代码较短,下面直接贴出完整源码):// Copyright Epic Games, Inc. All Rights Reserved.#pragma once#include "CoreTypes.h"#include "Misc/AssertionMacros.h"#include "Containe.原创 2021-08-10 20:32:41 · 381 阅读 · 0 评论 -
代码宏的一点小知识
本文是一篇关于宏定义的短文C/C++ 中我们可以定义宏来做一些代码的简化工作,一般我们不推荐使用宏,因为使用过程中很容易出现问题,目前有一些方法可以用来取代宏的部分功能(譬如内联函数),但是仍然有些宏功能现在还没有更可靠方便的替代方法,遇到这些使用情境的话,我们还是需要使用宏.宏的一个简单应用就是定义重复常量,譬如:#define MAX_COUNT 1024通过使用这种常量宏,我们可以较方便的维护代码中常量的变更.我们也可以定义参数宏,能够起到"模拟"函数等作用:#define MAX(.原创 2021-07-07 15:06:30 · 249 阅读 · 0 评论 -
Sweet Snippet 之 Lua Utils
之前写过不少关于 Lua 的 Utils 代码,不少都挺实用的,但是平时使用中却又总是觉得零散,遂而收集整理了一个 repo,希望可以持续完善,有兴趣的朋友可以看一看,欢迎 PR ~以下内容仅为当前 repo 的 readme 内容,后面持续更新:lua utilsdescthis is a simple lua util functions collection for easy usage and intergrationfunction reference(TODO)table u.原创 2021-02-17 09:38:45 · 356 阅读 · 1 评论 -
Sweet Snippet 之 Lua readonly table
Lua table 用作静态配置是常见的使用情境,而用作静态配置的 Lua table 往往都有保持只读的需求,本文简单介绍了一些让 Lua table 变更为只读的知识 (代码基于 Lua 5.4)基础基础变更 Lua table 为只读的方法,在 《Programming in Lua》 中就已经给出了(这里),基本思路即是通过 __index 和 __newindex 两个元方法来做 table 的读写限制,代码大体如下:function readonly(t) local prox.原创 2021-01-19 19:41:10 · 344 阅读 · 0 评论 -
C++ 标准库の使用迷思
转眼 2020 已经过去,回顾来看总有些迷幻,新年之际,自己倒不打算写些什么年终总结,想想还是记一小篇技术小文: C++ 标准库的使用迷思.了解 C++ 的朋友对于标准模板库肯定不陌生,平日用 C++ 开发时基本也是离不开标准模板库的,举个最普遍的例子:当我们需要动态数组时,甚至于仅需要静态数组时,我们都会第一个想到 vector :#include <vector>std::vector<int> int_array;原因就在于使用 vector 方便且稳定,不用自.原创 2021-01-02 17:35:02 · 305 阅读 · 0 评论 -
小记 TypeScript 中的循环引用问题
随着项目规模的不断增长,循环引用问题似乎总是不可避免,本文就 TypeScript 中可能出现的循环引用问题做了一些简单记录~平时编写 TypeScript 代码时,一般都倾向于使用模块(Module),通过结合使用 import 和 export 我们便可以方便的进行模块的导入和导出.举个简单的例子,假设我们有以下的 TypeScript 代码文件(A.ts):export class A { // methods here}可以看到,上述代码使用 export 导出了类型 A,如.原创 2020-10-09 19:43:24 · 8348 阅读 · 1 评论 -
Lua 5.4 新特性概览
本文简单介绍了一些 Lua 5.4 的新特性Lua 5.4 正式发布了,很多朋友应该会比较好奇 Lua 5.4 与之前版本的区别,本文就此简单介绍一些 Lua 5.4 的新特性.完整的 Lua 5.4 变更列表可以在这里找到,本文我们仅简单概览下其中主要的几点变化:分代 GC之前 Lua 采用的是 分步 GC 算法来进行垃圾回收, Lua 5.4 加入了 分代 GC 算法,值得注意的一点是, Lua 5.4 仍然支持 分步 GC 算法(并且目前 分步 GC 算法仍然是默认的 GC 算法),我们可.原创 2020-07-08 14:35:36 · 5803 阅读 · 0 评论 -
ZeroBrane Studio 简易适配 Lua 5.4
本文介绍了 ZeroBrane Studio 简易适配 Lua 5.4 的一些细节Lua 5.4 已经到 rc4 版本了,相信不少朋友都已经有所尝试,最简单的测试方法应该就是手动编译一个 lua.exe,然后直接命令行执行脚本:lua.exe lua_script_path当然,使用 IDE 来编写测试脚本会更方便些,自己平时用 ZeroBrane Studio 比较多,不过最新版本的 ZeroBrane Studio 还没有直接支持 Lua 5.4 脚本的运行和调试,自己简单尝试适配了一下,发.原创 2020-06-03 20:07:30 · 993 阅读 · 0 评论 -
编程小知识 之 杂记两则
本文简述了之前遇到的两则编程杂记隐式字符串字面量合并之前看到一段 C/C++ 代码:void func(const char* str) { // implementation ...}func("string" "params");代码定义了一个参数为字符串指针的函数 func,调用时却使用了 “string” “params” 这种字符串连写的方式(中间没有逗号分隔符),初看时我一直怀疑调用代码存在"笔误",甚至认为这种写法会引起编译错误,但实际上, func(“string.原创 2020-05-31 10:10:49 · 520 阅读 · 0 评论 -
.NET GC 精要(七)
本文讲述了 .NET GC 的一些细节知识,内容大部分来自于书籍 Under the Hood of .NET Memory Management(注:本文假设你了解 .NET 的基础知识,譬如值类型,引用类型等)深入并发执行模式(工作站模式下)的一点细节之前讲到工作站模式分为 并发 和 非并发 两种执行模式,其中非并发 执行模式比较容易理解,即在整个 GC 流程中应用线程(appli...原创 2020-02-09 10:23:46 · 405 阅读 · 0 评论 -
.NET GC 精要(六)
本文讲述了 .NET GC 的一些细节知识,内容大部分来自于书籍 Under the Hood of .NET Memory Management(注:本文假设你了解 .NET 的基础知识,譬如值类型,引用类型等)深入内存段(memory segment)的申请每个托管进程(managed process)都有各自独立的 SOH 和 LOH,并且在开始执行的时候,托管进程会为 SOH ...原创 2020-02-06 10:02:02 · 520 阅读 · 0 评论 -
.NET GC 精要(五)
本文讲述了 .NET GC 的一些细节知识,内容大部分来自于书籍 Under the Hood of .NET Memory Management(注:本文假设你了解 .NET 的基础知识,譬如值类型,引用类型等)深入之前讲过 .NET GC 出于效率等因素的考虑,对 SOH(Small Object Heap)进行了分代处理(Gen 0, Gen 1 和 Gen 2),当时只是大概讲述...原创 2020-02-01 08:54:10 · 368 阅读 · 0 评论 -
.NET GC 精要(四)
本文讲述了 .NET GC 的一些细节知识,内容大部分来自于书籍 Under the Hood of .NET Memory Management(注:本文假设你了解 .NET 的基础知识,譬如值类型,引用类型等)进阶之前在讲述 GC 分代回收的时候,我们只是了解了一下 SOH(Small Object Heap) 相关的内存回收行为,实际上,在进行 Gen 2 GC(也称为 full ...原创 2020-01-30 09:04:07 · 390 阅读 · 0 评论 -
.NET GC 精要(三)
本文讲述了 .NET GC 的一些细节知识,内容大部分来自于书籍 Under the Hood of .NET Memory Management(注:本文假设你了解 .NET 的基础知识,譬如值类型,引用类型等)进阶.NET 为了处理非托管资源(unmanaged resource)的释放问题,引入了终结器(Finalization)的机制,相关的代码实现上也并不复杂,仅需要在类型中定...原创 2020-01-27 10:50:13 · 475 阅读 · 0 评论 -
.NET GC 精要(二)
本文讲述了 .NET GC 的一些细节知识,内容大部分来自于书籍 Under the Hood of .NET Memory Management(注:本文假设你了解 .NET 的基础知识,譬如值类型,引用类型等)进阶之前我们讲述 SOH(Small Object Heap) 时提过其会执行内存压缩过程,但如果程序中存在大量的(小)对象的话,在 SOH 中完整执行一遍内存压缩也会消耗不少...原创 2020-01-25 12:09:54 · 1820 阅读 · 0 评论 -
.NET GC 精要(一)
本文讲述了 .NET GC 的一些细节知识,内容大部分来自于书籍 Under the Hood of .NET Memory Management(注:本文假设你了解 .NET 的基础知识,譬如值类型,引用类型等)基础稍有 .NET 基础的朋友一定知道 .NET GC 管理的是托管堆(managed heap)的内存释放问题,而托管堆又可以进一步分成两类:Small Object H...原创 2020-01-22 16:15:11 · 2357 阅读 · 0 评论 -
编程小知识之 Lua 长度运算符(#)
本文讲解了 Lua 中长度运算符(#)的一些知识(注: 以下讨论基于 Lua 5.3.5 版本)基础Lua 中的长度运算符(#)可以用于获取 table 的"长度",举个简单的例子:local t = { 1, 1, 1 }print(#t) -- 3但其实对于 table 而言,长度运算符并不等同于获取 table 的"长度",更准确一些的说法应该是获取 table 序列部分的...原创 2019-12-20 17:52:47 · 1538 阅读 · 0 评论 -
编程小知识之 虚假唤醒(spurious wakeup)
本文简单介绍了一些 虚假唤醒(spurious wakeup) 相关的知识(注: 本文假设读者对多线程开发有一定了解)高层次的多线程编程中,条件变量是个常见的同步方法,跟传统仅使用互斥量的方法相比,条件变量可以减少锁的竞争.拿 Pthread 举例,一个常见的条件变量的使用示例大概是这个样子的:// flag for syncbool g_signaled = false;pthr...原创 2019-12-16 20:07:16 · 783 阅读 · 0 评论 -
编程小知识之 JIT执行
本文简单介绍了 JIT 如何动态执行 native code 的知识自己之前对 DEP(数据执行保护) 有些依稀印象,简单认为在一般情况下,程序是不能动态执行 native code 的,后来突然想到 JIT(简单理解就是一种动态生成并执行 native code 的技术),虽然 JIT 的关注点大多都在如何生成 native code 上,但是自己却对 JIT 如何动态执行 native ...原创 2019-11-21 11:28:30 · 423 阅读 · 0 评论 -
编程小知识之 Lua 函数定义
本文简单介绍了 Lua 函数定义的一点知识在 Lua 中,我们定义函数的方式和在 C 语言中定义函数的方式很像:local function func_name(func_param) -- func_bodyend 但实际上,这种定义方式仅是 Lua 提供的语法糖,实际执行时, Lua 会将上面的函数定义转换为匿名函数的形式:-- define func_nameloc...原创 2019-11-20 20:26:34 · 1360 阅读 · 0 评论 -
编程小知识之 循环依赖
本文简述了一些循环依赖的知识~之前工作中遇到了循环依赖的问题,在此简单记录一些相关的知识~拿 Lua(5.3) 举例,如果我们循环 require 模块,就会触发堆栈溢出错误:-- module_1.luarequire("module_2")return {}-- module_2.luarequire("module_1")return {}-- test.lua-...原创 2019-10-30 11:11:43 · 1073 阅读 · 0 评论 -
编程小知识之 自增(自减)运算符
本文讲述了 C/C++ 中 自增(自减)运算符 的一些知识~自增(自减)运算符应该是 C/C++ 编程中的基础知识了,而自增(自减)运算符又有两种形式,分别是 前置自增(自减) 和 后置自增(自减) (出于简单考虑,后文仅以自增运算符进行举例讲解).譬如表达式 ++i 和 i++ 就分别表示对 i 进行前置自增 和 对 i 进行后置自增,用代码来说明的话, ++i(前置自增) 大概和以下代...原创 2019-10-29 11:04:28 · 1237 阅读 · 1 评论 -
编程小知识之 struct 构造函数(C#)
本文简单介绍了 C# 中 struct 构造函数的一些知识~struct(结构) 类型在 C# 中属于值类型(value type),其构造函数有一些限制:struct 有参构造函数中必须为所有成员(包括自动实现的属性,后面对于这点的说明从略)赋值举个例子:public struct Value{ public int Value1 { get; } privat...原创 2019-08-31 12:24:52 · 9828 阅读 · 0 评论 -
编程小知识之性能优化
本文简述了一种性能优化中常见的思维误区程序开发总是离不开性能优化,虽然规避不成熟优化的箴言早已有之,但我们又往往会被自己翻涌的思维火花所牵绊,义无反顾的开启自己的性能劣化之旅…考虑下面的一个简单问题(以 C# 为例):编写一个字符串修饰函数:给定一个字符串,为其添加一个固定的字符串后缀这个函数在譬如文件处理过程中很常用,代码也非常简单:const string SUFFIX = ...原创 2018-12-15 12:00:10 · 280 阅读 · 0 评论 -
编程小知识之 Random接口返回值
本文简述了 Random 接口返回值的一些相关信息平日工作中,(伪)随机数的使用一定是避不开的,拿 C# 为例,System 命名空间下的 Random 类型一般都是我们生成(伪)随机数的第一选择:var rand = new System.Random();var val = rand.NextDouble();Unity 中也在 UnityEngine 命名空间下提供了自己的 R...原创 2018-11-21 19:39:54 · 1111 阅读 · 0 评论 -
一种稀疏矩阵的实现方法
本文简单描述了一种稀疏矩阵的实现方式,并与一般矩阵的实现方式做了性能和空间上的对比矩阵一般以二维数组的方式实现,代码来看大概是这个样子:// C#public class Matrix{ // methods // elements ElementType[,] m_elementBuffer;}实现方式简单直观,但是对于稀疏矩阵而言,空间上的浪费比较严...原创 2018-09-29 12:52:52 · 1030 阅读 · 1 评论 -
[译]C++17, 语言核心层有哪些新的变化?
看到一个介绍 C++17 的系列博文(原文),有十来篇的样子,觉得挺好,看看有时间能不能都简单翻译一下,这是第一篇~C++11, C++14, 以及 C++17. 我猜你已经看出了其中的命名模式: 今年(2017)的晚些时候,我们便会迎来新的C++标准(C++17). 今年的3月份, C++17已经达到了标准草案阶段. 在我深入新标准的细节之前, 让我们先来总体浏览一下C++17.(译...翻译 2018-08-14 10:32:46 · 635 阅读 · 0 评论 -
[译]C++17,标准库有哪些新变化?
看到一个介绍 C++17 的系列博文(原文),有十来篇的样子,觉得挺好,看看有时间能不能都简单翻译一下,这是第二篇~C++17 有许多新的标准库变化,简单起见,这篇文章只介绍了以下内容:std::string_view,标准模板库中新添加的并行算法,新的文件系统库,以及3个新的数据类型:std::any, std::optional, 和 std::variant.让我们来了解一下其中...翻译 2018-08-18 14:38:21 · 2668 阅读 · 0 评论 -
[译]C++17, 语言核心层变化的更多细节
看到一个介绍 C++17 的系列博文(原文),有十来篇的样子,觉得挺好,看看有时间能不能都简单翻译一下,这是第三篇~在之前的文章中我介绍了一些C++17语言核心层的变化,这次我会介绍更多的相关细节,涉及的主题有:内联变量(inline variables),模板,auto相关的自动类型推导以及属性(attributes).C++标准整体的(特性)时间线上图中列出的是C++1...翻译 2018-08-28 17:25:38 · 2411 阅读 · 0 评论 -
[译]C++17,标准库变化的更多细节
看到一个介绍 C++17 的系列博文(原文),有十来篇的样子,觉得挺好,看看有时间能不能都简单翻译一下,这是第四篇~之前的文章中我简单介绍了一些C++17标准库的新变化,这次我会介绍更多的相关细节.让我们首先来看下之前未提到过的新内容.std::byte独立类型 std::byte 实现了 C++ 语言定义中的字节概念,他能用于访问对象的原始内存,不同于 char 等字...翻译 2018-09-04 11:22:44 · 1402 阅读 · 0 评论 -
[译]C++17,使用 string_view 来避免复制
看到一个介绍 C++17 的系列博文(原文),有十来篇的样子,觉得挺好,看看有时间能不能都简单翻译一下,这是第五篇~当字符串数据的所有权已经确定(譬如由某个string对象持有),并且你只想访问(而不修改)他们时,使用 std::string_view 可以避免字符串数据的复制,从而提高程序效率,这(指程序效率)也是这篇文章的主要内容.这次要介绍的 string_view 是 C...翻译 2018-09-08 10:49:40 · 17329 阅读 · 4 评论 -
[译]C++17,optional, any, 和 variant 的更多细节
看到一个介绍 C++17 的系列博文(原文),有十来篇的样子,觉得挺好,看看有时间能不能都简单翻译一下,这是第六篇~std::optional, std::any, 和 std::variant 有一个共同特点:他们都支持就地构造.另外的,std::variant 还支持访问者模式.首先,我们要了解一下这3种数据类型的功能作用.std::optional 是一种可能包含也可能...翻译 2018-09-12 14:19:35 · 4715 阅读 · 0 评论 -
[译]C++17,标准库新引入的并行算法
看到一个介绍 C++17 的系列博文(原文),有十来篇的样子,觉得挺好,看看有时间能不能都简单翻译一下,这是第七篇~C++17 对 STL 算法的改动,概念上其实很简单.标准库之前有超过100个算法,内容包括搜索,计数,区间及元素操作等等.新标准重载了其中69个算法并新增了7个算法.重载的算法和新增的算法都支持指定一个所谓执行策略(execution policy)的参数,通过调整这个...翻译 2018-09-15 14:32:02 · 6742 阅读 · 1 评论 -
编程小知识之switch语句
本文简述了几种 switch 语句的实现方式基础switch 语句大家都不陌生,平时在遇到较多相同的 if 语句判断时就会想到他,举个简单的例子:以下的代码// val is intif (val == 1){ Func1();}else if (val == 2){ Func2();}else if (val == 3){ Func3();}...原创 2018-12-22 12:03:17 · 2376 阅读 · 0 评论 -
编程小知识之协变和逆变
本文简述了 C# 中协变和逆变的一些知识在 C# 中, 协变 和 逆变 能够实现 数组类型 和 委托类型 的隐式引用转换, .NET Framework 4 (包括)以后, C# 也开始支持在 泛型接口 和 泛型委托 中使用协变和逆变,下面的内容也主要围绕泛型类型参数的协变和逆变来进行讲解.什么是协变?所谓协变(Covariance),是指能够使用比原始指定的类型派生程度更大的类型,...原创 2019-01-24 15:02:07 · 324 阅读 · 0 评论 -
问题小记之 使用 nil 索引 Lua table
本文简单介绍了使用 nil 索引 Lua table 的一些问题使用 Lua 已经不少时间了,遇到 “table index is nil” 的错误也很多次了,久而久之自己便形成了 Lua table 索引不能为 nil 的概念.但实际上,上述概念是不准确的,虽然下面的 Lua 代码确实会引起 “table index is nil” 的错误:local t = {}-- use ni...原创 2019-08-14 12:34:04 · 3650 阅读 · 1 评论 -
编程小知识之 JavaScript 调用堆栈
本文简述了几种在 JavaScript 中获取调用堆栈(call stack)的方法使用 console.traceconsole 支持 trace 方法,使用该方法可以向控制台输出当前的调用堆栈.示例代码如下:// logging_trace.jsfunction add(x, y) { console.trace('add called with ', x, 'and'...原创 2019-07-12 21:04:03 · 1171 阅读 · 0 评论