使用std :: copy而不是std :: memcpy复制字符时避免使用libc函数调用?

时间:2016-09-06 08:01:38

标签: c++ gcc

我希望这不是重复,因为已经提出了类似的问题。当gcc决定使用libc's implementation时,我担心使用std::memcpy。这可能不会发生,如果我们使用std::copy代替,也就是说,我们避免将此函数调用到libc中?如果是这样,生成的代码如何与libc的std::memcpy实现?

进行比较

3 个答案:

答案 0 :(得分:2)

不是一个重复的问题,但std::copystd::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]实现的任何调用开销都很重要。您需要查看分析。