我试图将两个char数组连接char a[9000]; char b[9000]到一个容器std::vector<char>.由于阵列大小不小.我正在尝试使用std::move()
class obj
{
public:
obj &operator <<(char *&&ptr)
{
//???
ptr = nullptr;
return *this;
}
private:
std::vector<char> m_obj;
};
Run Code Online (Sandbox Code Playgroud)
所以在主要功能
int main()
{
obj o;
enum {SIZE=9000};
char a[SIZE]; memset(a, 1, SIZE);
char b[SIZE]; memset(b, 2, SIZE);
o << a << b;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是移动char*的正确方法是什么?
环境:
Ubuntu 16.04.4 LTS
g ++ 5.4.0
打电话reserve()和复印.
好几件事.首先,你似乎对此的期望std::move是错误的.std::move不会神奇地移动任何东西(或移动任何东西,包括非魔法).它的作用是强制转换为一个右值引用,这可能使某些情况下移动.
其次,随着C++ 03开始,std::vector在保证有它的元素在内存中连续布局(这是事实的情况下反正之前C++ 03,但没有给出明确的担保).如果你使用std::move那么你必须使用晚于C++ 03的版本,所以std::vector必然连续地放置它的元素.
这意味着除了两个阵列碰巧彼此相邻的完全重合的情况之外,没有办法将两个数组中的元素转换为矢量而不进行复制.根本不可能移动它们,因为必须重新定位(=复制)至少一个数组.
此外,我无法想象如何从一个阵列中移动元素的方式就像你想要的那样.移动假定您接管所有权,这通常意味着您以某种方式修改移动的对象,使其仍然有效,但没有它以前拥有的任何资源.
如何使用在周围范围内具有自动存储持续时间的阵列?什么是在移动之后取消引用数组(这是可能的和合法的)呢?
此外,你想要将一个数组衰减到一个指针(这是完全合法的),然后以某种方式神奇地移动.但是,这不会移动数组的内容!你可以做的最好的是移动指针,但这没有意义,因为移动指针与复制它是一样的.
您无法复制数组元素,但您可以通过reserve()提前正确调用来节省一个内存分配和一个不必要的副本.
| 归档时间: |
|
| 查看次数: |
2224 次 |
| 最近记录: |