一些帖子比较了 C++ 风格函数
std::copy, std::equal, std::fill
与 C 风格函数 std::memcpy, std::memcmp, std::memset
之间的性能,例如:
但从实际角度来看,我还没有找到什么理由证明这些新功能取代旧功能是合理的。当然,功能列表并不详尽。
这些新版本有哪些实际优势?
如果性能不是选择标准,是否需要(时间允许)将所有出现的这些 C 风格函数替换为 C++ 版本?
我试图理解为什么
c++
中引入了一些功能以及是否有必要进行替换。
正如评论中指出的那样,
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
。
memset
有两个严重的限制。
首先是容器。您只能将多个元素添加到使用连续内存的容器中。它适用于
memset
或 std::array
,但不适用于大多数其他容器。接下来是元素。您只能 std::vector
普通可复制的对象。像
memset
这样“简单”的东西已经不是可以轻易复制的了。在某些情况下可以使用
std::string
。您提到的其他函数更普遍适用,当它们可以被
memset
替换时,编译器可以做到这一点。