Skip to content
败犬日报 2025-10-14

败犬日报 2025-10-14

1. std::map 用 const_cast 修改 key 是不是未定义行为

cpp
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,但是复杂度是 O(logn),很显然标准没有提供一个更快的接口。

真有需求只能手写数据结构了。

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》