败犬日报 2025-10-14
1. std::map
用 const_cast 修改 key 是不是未定义行为
std::map<int, int> map = {{1, 2}};
const_cast<int&>(map.begin()->first) = 2;
是 UB。这是因为 map value_type 是 std::pair<const Key, Value>
,初始化就带有 const 就不能修改了。
同时 https://en.cppreference.com/w/cpp/container/map/extract.html 里说:
extract is the only way to change a key of a map element without reallocation
只能用 extract 修改 key,但是复杂度是
真有需求只能手写数据结构了。
2. const_cast 和 mutable 的区别
const_cast 只是引用的类型转换,被修改的对象带 const 的话还是 ub。
mutable 的效果是对象带 const 时成员不带 const。
3. x86 函数调用的原理(文章)
https://mp.weixin.qq.com/s/zMe05GJz67CHvf1wds4t6g
每个 C++er 的基本功。
4. x86 调用约定的补充(群友的笔记)
__cdecl
- x86 程序默认调用约定。
- 传参顺序为从右向左。
- 传参方式为栈传参。
- 平栈方式为外平栈(由调用者平栈)。
__stdcall
- windows 动态链接用的。
- 传参顺序为从右向左。
- 传参方式为栈传参。
- 平栈方式为内平栈(由被调用函数平栈)。
__fastcall
- x64 程序默认调用约定。
- 传参顺序为从右向左。
- 借助寄存器传参,不同架构使用的寄存器不同,x86 使用 2 个寄存器,x64 使用根据不同的编译器使用的寄存器也不一样。在 windows 下使用 4 个寄存器,linux 下使用 6 个寄存器。
- x86
- 第一个参数使用 ecx,第二个使用 edx,其它参数使用栈。
- 平栈方式为内平栈(由被调用函数平栈)。
- x64
- linux 下为 edi、esi、edx、ecx、r8d、r9d,windows 的为 ecx,edx,r8d,r9d。
- 平栈方式为外平栈(由调用函数平栈)。
5. 《红黑树忘记浇水了会不会枯萎》
《红黑树忘记浇水了会不会枯萎》《指针在内存里动的太快了断掉怎么办》《线程在sleep的时候失眠怎么办》《二叉树的父母节点不合离婚了怎么办》《队列里要是有人插队怎么办》《指针在内存里生锈了怎么办》《叶子节点被切叶虫吃了还能不能回来》《子类不想继承父类要独自一个人闯荡该怎么办》《Python被bug卡住了,怎么把这个虫子从蟒蛇嘴里拿出来》《男朋友说自己new的对象太多了,该如何取证他脚踏n只船》《创建链表的时候身边没有链子怎么办》《Windows is frozen. Can I pour some hot water on my PC》《大模型有幻觉了要不要送医院》《数据上云了以后,如果下雨会不会把数据也下下来》《在程序里产生野指针算不算一种放生》《内存读取老是越界,怎么让它保持距离感》《多线程混到一起打结了怎么办》《The dog bit me 8 times, that's 1 byte》