类与封装
空类为什么占 1 字节、成员按声明顺序构造而不是初始化列表顺序、移动构造少写一个 noexcept 就让 vector 扩容多拷一千次——类的骨架规则一次讲清。
共 12 篇 · 全部标签
空类为什么占 1 字节、成员按声明顺序构造而不是初始化列表顺序、移动构造少写一个 noexcept 就让 vector 扩容多拷一千次——类的骨架规则一次讲清。
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 到底怎么落地。
unique_ptr 真的是零开销吗、make_shared 省掉的那次分配是什么、循环引用怎么把对象留在内存里——用 sizeof 和 new 计数器实测。
30 万次查找实测 map 比 unordered_map 慢 10 倍、sorted vector 二分反而快过 std::set、operator[] 会偷偷插入、reserve 让 push_back 快 2.4 倍——用数字建立选型直觉。
完美转发到底省掉多少次拷贝(实测 100 次调用零拷贝)、函数模板为什么不能偏特化、以及一个反常识结论:concepts 的报错行数比无约束版更多,但它把错误停在了调用点。