c++ - 将本地 std::array 移动到传递的 std::array& 参数
问题描述
我对将 std::array 操作移动到引用传递的 std::array 容器感到困惑。
我在哪里读过评论,这被认为是未定义的行为,还是正确的结果?
还是它真的复制了元素?
#include <iostream>
#include <array>
#include <algorithm>
using namespace std;
void printElements(string description, array<uint8_t,16>& arr)
{
cout << description << ":\t";
for(auto i:arr)
{
cout << (int)i << " ";
}
cout << "\n";
}
void assignToArr(array<uint8_t,16>& in_out_arr)
{
array<uint8_t,16> arr2;
arr2.fill(4);
move(arr2.begin(),arr2.end(),in_out_arr.begin());
printElements("before arr2 destruction", in_out_arr);
printElements("arr2 before fill(5)", arr2);
arr2.fill(5);
printElements("arr2 after fill(5)", arr2);
}
int main()
{
array<uint8_t,16> arr1;
assignToArr(arr1);
printElements("after arr2 destruction", arr1);
return 0;
}
结果:
before arr2 destruction: 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
arr2: 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
arr2: 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5
after arr2 destruction: 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
解决方案
当您在 C++ 中移动一个普通类型时,它会被复制。
C++ 中的移动操作告诉类型“我们不依赖于源数据之后的样子,随意做一些更有效的事情”。对于普通类型(如int
),归零或以其他方式更改源没有任何好处。
所以它没有。
对于更复杂std::vector<int>
的类型,例如 ,移动通常会导致空std::vector<int>
(并非总是如此!无法保证;只是旧向量将有效地分配或销毁)。
std 数组在内部存储其数据,因此如果类型又是微不足道的(如果其中的数据是微不足道的,它本身就是微不足道的),则没有有效的移动改进。
这里的琐碎是指 C++ 标准中使用的一个术语。
推荐阅读
- javascript - 通过使用 jquery 插入变量来修改 CSS
- java - 使用 Jenkins 和 Selenium Java 调度自动化任务
- javascript - 如何中止获取请求并立即开始新的请求?
- reactjs - react-router-dom 链接在反应传单自定义弹出窗口中不起作用
- shell - 未通过 SFTP get 命令返回多变量字符串
- perl - 如何使用perl从特殊字符串中提取子集
- python - tkinter 中 B = Button(....).grid() 和 B = Button(...) B.grid() 有什么区别
- php - 如何修复 XAMPP“Apache / mysql 意外关闭”错误
- python - Django 检索不同列值的行
- java - 有一种方法可以用我要求的不同方法来验证 API 响应吗?