gpt4 book ai didi

c++ - 谁为不通过 const 引用付出代价

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:09:53 26 4
gpt4 key购买 nike

给定:

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)可能会做三件事:

  1. 内存管理器(C++ 运行时或自定义分配器)在其存储中为新 vector 搜索可用内存块。如果它能找到它,那么它会转到第 3 步。
  2. 内存管理器(C++ 运行时或自定义分配器)从操作系统请求更多内存。此调用本身相对便宜(与系统调用一样多),因为操作系统以惰性模式提供内存 - 实际分配发生在第一次写入请求的 VM 页面时。
  3. 编译器生成的代码(应用程序)就地执行 new如果 T,则为新 vector 中的每个元素复制 c-tor不是简单的可复制构造的。否则,memcpy()或者它的优化矢量化(在 sse 意义上)对应物被调用。就在第一次写入新内存之前,如果它是在 #2 中从操作系统获取的,操作系统将需要实际分配新的 VM 页面,这可能会触发 RAM 访问(硬件)、TLB 查找(硬件 + 操作系统)换入/换出(操作系统)。

在您的具体示例中 T是简单的可复制构造的,所以最坏的情况开销将是 C++运行时内存块查找 + sbrk()系统调用 + memcpy()打电话。

关于c++ - 谁为不通过 const 引用付出代价,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38740670/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com