STL 容器与迭代器
vector 每次翻倍的实测序列、reserve 把 15 次分配变成 1 次、list 遍历比 vector 慢 16.7 倍、emplace_back 省掉的正好是那 5 次移动——容器选型的数字版。
vector 每次翻倍的实测序列、reserve 把 15 次分配变成 1 次、list 遍历比 vector 慢 16.7 倍、emplace_back 省掉的正好是那 5 次移动——容器选型的数字版。
一次 throw+catch 实测 4 微秒、比返回码慢十倍;析构函数抛异常和 noexcept 里抛异常都在编译期就被 -Wterminate 点出来;expected 的开销只有 24 字节。
同一份源码在 gcc 和 g++ 下结果不同——字符常量的类型、const 的链接性、f() 的含义、指定初始化的顺序。这些差异不是风格问题,是编译期就分岔的语义。
构造函数里调虚函数会静默降级成基类版本、虚函数的默认参数按静态类型取、对象切片把 72 字节压成 8 字节——继承的规则一条条用输出验证。
每个版本到底解决了什么问题,以及一份本机 g++ 13.1.0 的实测支持矩阵——std::expected 已经能用,而 std::print、mdspan、deducing this 还不行。
std::move 一个字节都不搬、被移动对象必须处于"有效但未定"状态、return std::move(local) 会让复制消除退化成一次移动——全部用计数器实测。
两条反汇编指令看清虚函数调用的代价——mov (%rcx),%rax 加 jmp *(%rax);多继承下同一个对象的两个基类指针地址不同;dynamic_cast 比 static_cast 慢 3.7 倍。
构造中途抛异常时哪些资源会被释放、手写一个 20 行的 scope guard、非虚析构 delete 让派生类析构次数为 0,以及 rule of zero 到底怎么落地。