【发布时间】:2020-10-07 11:08:09
【问题描述】:
我正在尝试将一组简单对象重置为零,如下所示:
using Node = std::array<std::uint16_t, 256>;
using Array = std::array<Node, 4096>;
void reset_1(Array& a) {
std::fill(std::begin(a), std::end(a), Node{});
}
void reset_2(Array& a) {
a = {};
}
void reset_3(Array& a) {
a.fill(Node{});
}
所有这些函数都完成了工作,但是查看编译器资源管理器(同时使用 Clang 10.0.1 和 gcc 10.2),reset_2 在一个 memset 中完成,而另外两个在多个块中完成(使用std::fill_n 的结果相同)。
在我的真实案例中,我实际上想要重置所有节点,除了第一个节点。这将导致我写如下内容:
void reset_not_zero_1(Array& a) {
std::fill(std::begin(a) + 1, std::end(a), Node{});
}
void reset_not_zero_2(Array& a) {
std::memset(a.data() + 1, 0, sizeof(a) - sizeof(Node));
}
我的问题是:我是否使用reset_not_zero_2 调用了某种未定义的行为?该数组可以简单地复制,但也许我遗漏了一些东西。
【问题讨论】:
-
我也会考虑这个选项:将第一个元素存储在
temp,重置整个数组,将temp分配给第一个元素。 -
没关系。
std::array只是一个包裹在对象中的 c 样式数组,用于向其中添加所有复制语义和其他方便的东西。