我希望这不是重复,因为已经提出了类似的问题。当gcc决定使用libc's implementation时,我担心使用std::memcpy
。这可能不会发生,如果我们使用std::copy
代替,也就是说,我们避免将此函数调用到libc中?如果是这样,生成的代码如何与libc的std::memcpy
实现?
答案 0 :(得分:2)
不是一个重复的问题,但std::copy
是std::copy
的实施的一部分。
简而言之,使用std::copy
通常不会阻止GCC使用libc。
如果你真的想阻止优化,那么可能会有一些编译器选项组合,我不知道。您必须仔细研究{{1}}的实现方式,它们可能碰巧以无法禁用的方式编写它。
答案 1 :(得分:2)
根据您的观点,这并不重要或有帮助。
在我知道的至少一个标准库实现中, std::copy
以这样的方式实现,即它检测其输入是否是通过简单可复制类型的连续迭代器,并且只使用std::memmove
无论如何那个案子。编译器甚至可能会认识到传递的范围是不同的,并且会依次用memcpy
替换它。
换句话说,您可以切换到std::copy
,但编译器很可能只会将其切换回来。
答案 2 :(得分:1)
std::memcpy
通常是围绕C std
的{{1}}命名空间包装。
由于大多数现代C库提供了此函数的高度优化实现,包括memcpy
指针参数 - C ++ 11/14中不可用的关键字 - 它可能更有效。如果编译器可以证明restrict
在不同的范围上运行,它也可能对gcc使用std::copy
之类的东西。例如,可能仍然需要元素来满足__builtin_memcpy
类型特征。
例外情况可能是您在非常短的范围内使用is_trivially_copyable
,并且编译器无法在编译时推断出范围长度,但仍会生成std::copy
调用。我仍然怀疑mem[cpy|move]
实现的任何调用开销都很重要。您需要查看分析。