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

C++20特性 现在是2023年,C++23都出来很久了(尽管很多编译器没有实现全功能),但还是有着大量C++11/17的老项目,出于人力和风险的考虑并没有上新标准,我作为一个C++菜鸡,也没想着去了解C++20都更新了什么,直到最近遇到了很多语言层面的问题,于是想着学习一下C++20特性 当然这里面不止C++20 语言特性 指定初始化 可以只初始化一部分,可以指定想要初始化的部分 st...

C/C++编译与链接 《程序员的自我修养:链接、装载与库》阅读笔记 编译 编译可以被分为四个步骤: 预编译(Prepressing) 编译(Compilation) 汇编(Assembly) 链接(Linking) 预编译 gcc -E hello.c -o hello.i cpp hello.c > hello.i 移除并展开所有#define 处理所有条件预编译指令,如#...

map 突然发现一个华科大佬的博客,学习一波 map是一种映射结构,能够存取键值对(键是唯一的) map通常有两种实现方式:哈希表(std::unordered_map)、红黑树(std::map) 哈希表 哈希表的查找删除均为O(1) 哈希表是一种空间换时间的算法,现在我们要存储一组键值对,假设键的范围是0~99,那么我们就开辟一个大小为100的数组,数组中存储了指向值的指针,于是我们...

grep搜索lib grep 前几天写代码发现链接不到某个函数,同事说我肯定少链接了一个.lib文件,然我却不知道少链接了谁 同事交给我一个小技巧,lib文件本质是一个代码压缩包,是可以对里面的内容进行搜索的,在Linux(WSL)中进入存放.lib的库,输入命令 grep -r <函数名> . 就会匹配vkCmdBeginDebugUtilsLabelEXT这个函数在哪一个.l...

C++获取CPU型号 不同CPU的指令集有所差异,尤其是在使用SIMD之类的feature时要十分注意,以MSVC获取CPU型号为例 核心是使用指令__cpuid,其实你也可以__asm {}自己写汇编 #include <iostream>#include <string>#include <intrin.h>#include &...

C++20下spdlog使用踩坑 spdlog是一个开源的被广泛使用的C++log系统,于是我模仿Piccolo引擎写了一个Log系统,结果由于C++不允许连续进行两次及以上的用户自定义的隐式构造,使得spdlog的log函数无法正确推断匹配Args...,最后在公司C++高手的帮助下成功解决了问题,于是在此记录一下踩坑历程 最初的版本 我参考开源项目的实现,使用spdlog写了一个简易的L...

我不小心取了一个右值的地址 感觉每次背八股的时候都会看到左右值,但一直都是纸上谈兵(原谅我项目能力太差),结果今天真遇到了(我取了一个右值的地址 左值:占用一定内存,有明确的可辨认地址的对象,在表达式结束后仍然存在 右值:左值以外的对象(类似于临时对象,在表达式结束后就会销毁) 右值是一个临时的没有明确地址的对象,可能表达式结束这个对象就被销毁了,自然取它的地址是不确定行为,C++11后...

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

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

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