【发布时间】:2017-05-07 05:51:17
【问题描述】:
对于作为指针的迭代器ptr,std::fill_n(ptr, n, 0) 应该与memset(ptr, 0, n * sizeof(*ptr)) 执行相同的操作(但请参阅@KeithThompson 对this answer 的评论)。
对于 C++11/C++14/C++17 模式下的 C++ 编译器,在哪些条件下可以期望它们编译为相同的代码?并且当/如果它们不编译为相同的代码时,-O0 是否存在显着的性能差异? -O3?
注意:当然,部分/大部分答案可能是特定于编译器的。我只对一两个特定的编译器感兴趣,但请写下你知道答案的编译器。
【问题讨论】:
-
FWIW MSVS 使用模板魔法来确定它是否可以在容器内使用 memset 和 memcpy。不确定算法是否也以这种方式实施,但认为他们会这样做并不是一个飞跃。也就是说,以两种方式编码和衡量。这会给你最好的答案。
-
@ChrisBeck:见编辑。
-
@NathanOliver:好的,但是 - memset 也是一个需要以某种方式实现的功能。
-
空指针不一定都是 0 位。我不确定标准对浮点类型的要求,但我认为那里的情况相同。即
std::fill_n,它用逻辑空值填充,一般情况下与memset不一样。 -
根据我的经验,大多数优化器 足够聪明,可以识别 for 循环或标准算法等效于编译器内在函数/__builtins 之一,并生成相同的代码.除非代码被分析器捕获,否则我不会打扰。
标签: c++ c++11 memory c++-standard-library memset