作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
给定:
void foo(std::vector<int> v);
void bar()
{
std::vector<int> v = ...; // many items
foo(v);
}
分析工具中的什么会显示为热路径?会是std::vector<T>
吗?的复制构造函数、运行时还是操作系统?我记得在学校(我不是 C++ 开发人员,只是和一些人一起工作)这将复制 v
这可能需要时间。我知道像这样的签名:
void foo(const std::vector<int>& v);
避免了这种可能代价高昂的复制操作。
最佳答案
正在复制 std::vector<T>
按值(value)可能会做三件事:
new
如果 T
,则为新 vector 中的每个元素复制 c-tor不是简单的可复制构造的。否则,memcpy()
或者它的优化矢量化(在 sse
意义上)对应物被调用。就在第一次写入新内存之前,如果它是在 #2 中从操作系统获取的,操作系统将需要实际分配新的 VM 页面,这可能会触发 RAM 访问(硬件)、TLB 查找(硬件 + 操作系统)换入/换出(操作系统)。在您的具体示例中 T
是简单的可复制构造的,所以最坏的情况开销将是 C++
运行时内存块查找 + sbrk()
系统调用 + memcpy()
打电话。
关于c++ - 谁为不通过 const 引用付出代价,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38740670/
我是一名优秀的程序员,十分优秀!