败犬日报 2024-11-18
1. 有 string + string_view
的重载吗
C++26 才有。
2. volatile 是 atomic 的替代吗
volatile 【不是】原子的、【不】保证内存序、【不】建立线程同步,它不应该被应用于多线程编程。中文互联网上绝大多数关于 C++ 中 volatile 的文章都是完全错误的。请使用 std::atomic 或 std::memory_order(如果有必要、且你是专家)。
MSVC 对标准 C++ 语法做出了扩展,给 volatile 增加了线程间同步的含义,但考虑到可移植性,你没有理由在 C++11 及以后的标准库提供了优秀解决方案的前提下再去使用这种非标扩展。
标准 C++ 的 volatile 几乎只在一种情况下有用:作为驱动开发者,需要操作映射到外设 I/O 的内存。对于绝大部分程序员而言,用不到、也不应该使用 volatile。
3. shared_ptr 是不是性能瓶颈
不滥用的话,极少会成为瓶颈。已知什么数据库、自驾这种都没到那种程度。
大多数情况 shared_ptr 的性能开销是可以忽略的,不能忽略的场景基本都有明显的优化方案。比如可以考虑维护一个 object pool
,改用 boost::intrusive_ptr
。
4. 面试让写一个单例,我直接 magic static,面试官说他不相信编译器会生成 atomic check,最后挂了
难蚌。
magic static(用静态局部变量实现单例)是标准行为。https://zh.cppreference.com/w/cpp/language/storage_duration 有记载:
如果多个线程试图同时初始化同一静态局部变量,那么初始化严格发生一次(类似的行为也可对任意函数以 std::call_once 来达成)。
5. 面试官暗示半天我才听懂他在叫我给返回值写 move
难蚌 +1。
返回值用 std::move
会阻止 RVO 优化,在任何时候性能都不会更好,反而有可能更差。
https://zh.cppreference.com/w/cpp/language/copy_elision
6. 败犬锐评 proxy
proxy 是这个库。
主要优化是胖指针,函数指针和对象指针放一起,不需要传统虚函数那样从对象上获取函数指针。
make proxy 如果表很小的话,直接存函数指针,而不是函数指针表,少一次间接寻址。
proxy 和虚函数比没什么特别的性能优势,只有非侵入式和侵入式的区别,没必要像一些网友那样捧上天。
7. 多态的性能
性能从高到低:编译期多态 > 运行期闭集 > 运行期开集
编译期多态,举例:模板、运算符重载和 CRTP。
运行期闭集,举例:std::variant
。
运行期开集,举例:虚函数。
8. 如何把类定义和类成员函数声明分开
没办法。
C# 那种扩展方法很好用,可惜 C++ 没有,现在 C++ ranges 只能用管道的方式。
9. 统一的 ABI
现在基本已经统一了。
微软之所以不用 Itanium ABI 就是为了兼容旧代码。