抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

无状态方法 线程安全 同事经常跟我强调线程安全的重要性,比如下面这段代码,id是一个静态成员变量,被所有Student类的对象共享,在多线程环境下可能会造成不确定行为 class Student{private: static int id = 0;public: int getId() { return id; }}int Student::i...

内存分配 最近看了一些关于内存分配的分享,发现操作系统相关的知识都忘光了,于是打算借助Linux内核的内存分配机制,简单复习一下内存分配相关的理论知识 程序运行时不断进行内存的申请与释放,高效的分配方式不仅能提高内存的利用率,还能提高性能。 Linux内存分配原理 地址 程序需要装入内存才能运行,程序开始的位置相较于内存0地址会有一段偏移,这个偏移被称为物理地址。 在程序内部,以程序开头...

C++函数调用 C++支持两种函数调用方式,__stdcall和__cdecl,两者对栈帧(stack frame)的处理方式不同,__stdcall是由被调用函数来清理栈帧,__cdecl是由调用函数来清理栈帧。一旦混用,容易引发错误 两者混用可能会导致栈帧没有被释放或者被连续释放两次 stack frame 栈帧用于维护函数调用的上下文信息,在函数调用时,会在栈上分配一块内存,用于存...

Git 使用记录 记录一下平时使用Git的记录 为什么使用Git 程序开发的第一步,就是做版本管理。频繁提交,可以便于环境恢复和Bug查找。分支开发,也能便于合作与多设备协同。配置Review规范,你还可以知道你的合作者在干什么,有效避免了因为开发者习惯能力差异导致的项目丑陋。配合CI的编译预检查,还能提高代码的稳健性。总之版本管理十分重要。 版本管理工具有很多,游戏开发由于拥有大量会频...

C++模版 《C++ Templates: The Complete Guide》笔记 为什么使用模版 为了实现泛型 如果不使用泛型,对于一些通用的函数或容器,比如print、vector,我们可能需要逐个实现他们的函数,尽管这些函数的功能十分类似(可能相同),低效复杂而且难以维护 在C++标准库中使用了大量模版 模板的缺点 难以阅读、调试 容易触发编译报错(比如将<<运算...

有意思的代码 记录一下平时遇到的有意思的代码,不定期更新 在注释中的立方体 001------101 / | / | / | / |011------111 | | 000--|--100 | / | / | / | /010------110 消除未使用变量 有人会认为C++的警告(Warming)等同于报错,于是会通过一些宏关掉一些警告...

SWIG实现Python调用C++ 在实际项目开发中,我们经常有跨语言交互的需求,比如使用Python/Lua脚本调用引擎代码。常用的方案有很多,我们来介绍SWIG 语言 特点 C++/CLI C++和C# 微软为.NET平台高度定制的拓展,允许C++调用托管代码 SWIG 多语言 跨平台多语言,需要写.i文件,有一定侵入性 Boost Python和C++ J...

Mac开发环境配置 前几天遇到一个问题,某个VPN软件开启后无法正常关闭,而强行关闭后并没有还原网络配置,导致我只有开着VPN才能连接网络,一时间没有好的办法,于是将Mac重装了系统,记录一下环境配置,没准以后还会用到 我的设备是Macbook Air M1,主要用于Metal开发和写博客 Mac重装系统 重要文件注意备份(放在iCloud最方便) 在关机状态下长按电源键,此时会提...

C与C++的DLL 今天中午跟同事吃饭时,有人分享他在清理项目中的Warming,其中包括C++风格的DLL,我才知道,DLL建议写C风格的 根本原因是,C++功能复杂,更依赖Name Mangling,而三大编译器具体实现不尽相同,使得ABI不确定 DLL 我们都知道,代码到可执行文件,要先代码编译得到目标文件,目标文件链接得到可执行文件。但其实可执行文件在执行时,还会进行装载 D...

前缀和 本人没有算法基础,以下均为春招刷Leetcode的笔记,仅用于记录,侵权勿喷 前缀和本质是一种预积分手段,运行时只需要得到边界值,就能快速、无损地获得区间积分值,二维的前缀和SAT在图形学中也有重要的运用 注意数组越界,尤其是前缀乘 明确索引的含义,这关系着数组的长度是否需要+1 前缀和可以使用哈希表加速查找 除自身以外数组的乘积 leetcode 给你一个整数数组 num...