Q. Lambda 和函数对象的关系?
A. Lambda就是函数对象 , 所以我前面提到函数对象的东西跟Lambda 是共通的 , Lambda 就是一个匿名函数对象 , 自动帮你生成了一个函数对象 。
Q. bind 性能为什么低?
A. bind产生了一个对象 , 里面做了类型擦除 , 调用它时需要做一次类似于虚函数这样的转发 。肯定比不上 lambda , 因为如果你用 lambda 的话很大程度上可以做内联 , bind 很多情况下不能内联 。一般来讲 , 现代 C++ 已经基本上没有什么需要用 bind 的地方了 , 都可以用 lambda 代替 。
Q.如果用 pool allocator 1000大小的map是不是也可以一次性malloc?
A. 不会 , 只是说你向系统申请内存的次数少 , 但 map 本身还是会执行 1000 次的分配 , 最关键在于你内存的局域性不一定能保证 。当然如果你的 pool allocator 做得好的话确实可以优化到接近于我前面说的 vector 这样的程度 。事实上这两种都不一定是最优化的情况;取决于你具体的使用场景 , 可能可以进一步优化 。比如说我在实际项目里有一种优化的场景是 map 基本上是不变的 , 这种情况下我可以进一步优化到运行时没有初始化开销 , 完全静态 , 这种情况下运行时只是做一个查询 , 而没有任何分配开销了 。
Q. vector 1000次的测试数据是不是跟 CPU 有关?
A. 可以这么说吧 , 具体肯定需要自己测的 。我这个数据我相信是具有一定普遍性的 , 但肯定也有平台相关性 , 跟 CPU 可能有一定的相关性 。跟 OS 的相关性只有一点 , 就是你使用的内存分配器本身的开销怎么样。
Q. nop 用到自旋锁 , 低功耗?
A. 我现在是觉得自旋锁并不一定是个好主意 , 因为我自己设计过一些无锁的数据结构 , 实测下来 , 现在无锁的数据结构不一定有性能优势 , 性能经常还不如直接加锁 , 因为无锁的情况下意味着没有满足条件的话就会继续往下执行 , 你会继续占住CPU , 你即使 nop 也是占住 CPU 了 , 因为你是无锁的话 , 做一个spinlock 肯定会有一个循环 , 会不停在那转圈 , 不管怎么样 , 你会额外做一些操作 。如果是加锁的 , 当前这个线程就没有任何操作 , 完全交给操作系统、交给我的运行库去调度 。
Q. 什么系统才能用到性能优化?
A. 我觉得任何系统都用得到性能优化——如果你不需要性能优化的话 , 你干吗用 C++?用 C++ 就是为了性能 。
Q. Lambda一定要用模板参数接收吗?
A. 当然不一定了 , 但是你用模板参数接收的话 , 有望达到最高性能 。只有在用模板参数接收这种情况下才能满足我前面说的内联 , 如果你用function或者函数指针的话 , 都会降低内联的机会 。
Q. 什么情况下使用类型擦除?
A. 每一个函数对象 , 每个 lamda 都是不同的类型 , 所以需要用模板参数的方式来接收 , 这种情况下我们能达到最高的性能 。但同时因为它必须用模板参数来接收 , 所以每一次用不同的对象类型去调这个函数模板 , 都会产生不同的代码 , 也就意味着你有可能会有二进制膨胀 。这是一种情况 。另外一种情况是 , 你需要用一个 map 或者是 set 或者 vector 来接收一堆不同的函数对象或者 lambda 表达式 , 这种情况下 , 因为你需要让这个容器能够放下不同的函数对象 , 也需要用类型擦除 , 也就是说让不同的对象变成同一种类型的对象 , 把它变成同一种类型 , 我只关心它的参数、返回值等等 。
- 美甲培训学校如何
- 服装设计培训 服装设计师培训学校
- 学会计 会计培训学校机构
- 英语口语培训 口语培训课程
- 影视摄影师培训学校
- 职业培训 深圳职业培训学校
- 装饰培训机构 装饰设计培训哪里好
- sigill sigikid
- 广州美容学校推荐 广州美甲培训学校地址
- 西安计算机培训机构哪个最好 西安计算机培训学校有哪些
特别声明:本站内容均来自网友提供或互联网,仅供参考,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
