首页 > 解决方案 > 将本地 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++stdarray

解决方案


当您在 C++ 中移动一个普通类型时,它会被复制。

C++ 中的移动操作告诉类型“我们不依赖于源数据之后的样子,随意做一些更有效的事情”。对于普通类型(如int),归零或以其他方式更改源没有任何好处。

所以它没有。

对于更复杂std::vector<int>的类型,例如 ,移动通常会导致空std::vector<int>(并非总是如此!无法保证;只是旧向量将有效地分配或销毁)。

std 数组在内部存储其数据,因此如果类型又是微不足道的(如果其中的数据是微不足道的,它本身就是微不足道的),则没有有效的移动改进。

这里的琐碎是指 C++ 标准中使用的一个术语。


推荐阅读