std::copy、std::equal、std::fill 相对于 memcpy、memset、memcmp 的实际优势

问题描述 投票:0回答:2

一些帖子比较了 C++ 风格函数

std::copy, std::equal, std::fill
与 C 风格函数
std::memcpy, std::memcmp, std::memset
之间的性能,例如:

但从实际角度来看,我还没有找到什么理由证明这些新功能取代旧功能是合理的。当然,功能列表并不详尽。

这些新版本有哪些实际优势?

如果性能不是选择标准,是否需要(时间允许)将所有出现的这些 C 风格函数替换为 C++ 版本?

我试图理解为什么

c++
中引入了一些功能以及是否有必要进行替换。

c++ memcpy memset memcmp
2个回答
3
投票

正如评论中指出的那样,

std::copy
等有效,而
std::memcpy
等则有效。仅在非常有限的情况下起作用。特别是,
std::memcpy
不适用于具有重要构造函数的任何内容,因此不适用于任何标准容器。即使在 C 风格
struct
或 C 风格
struct
数组上使用时,它也只执行浅复制,因此根据对象的语义,它甚至可能无法在 C 风格
struct
上工作其中包含一个指针。

关于性能,当然没有任何保证。但是编译器将能够访问

std::copy
的源代码(因为它是一个模板),并且通常能够内联它——对于 C 风格的
struct
,这通常会导致复制更大的块(机器字,而不是字节)。在
std::memcpy
的情况下,通常存在一个函数调用,它隐藏有关底层上下文的任何信息,并且需要逐字节复制(导致循环中的次数更多),或者需要复杂的逻辑来处理对齐和可能的奇数字节。 C 标准确实允许
memcpy
成为一个宏,解析为触发某种编译器优化的特殊符号,但我认为这在 C++ 中是不合法的。一些早期的(C)标准之前的 C 编译器确实将
memcpy
视为关键字,以便生成内联代码。但这都是很久以前的事了(在第一个 C 标准之前)。

在当今的 C++ 代码中,绝对没有理由使用

std::memcpy


2
投票

memset
有两个严重的限制。

首先是容器。您只能将多个元素添加到使用连续内存的容器中。它适用于

memset
std::array
,但不适用于大多数其他容器。
接下来是元素。您只能 

std::vector

普通可复制的对象。像

memset
这样“简单”的东西已经不是可以轻易复制的了。
在某些情况下可以使用

std::string

。您提到的其他函数更普遍适用,当它们可以被

memset
替换时,编译器可以做到这一点。
    

© www.soinside.com 2019 - 2024. All rights reserved.