如果C++;禁止你记忆某些类型? 我写了一些东西来分配对象/内存,我遇到了一个问题,因为C++似乎禁止移动类型,而不是简单的可复制的。我假设有时内存分配器需要移动内存,如果它这样做,就不能返回直接指针或直接句柄,而是返回指向索引的间接指针或句柄,这些指针或句柄可以在内存移动时更改。我猜这就是内存碎片整理/压缩时所做的,但是当C++禁止我对特定对象进行记忆时,我如何移动内存呢?例如: char* buffer = new char[128]; unsigned long long createMyType() { // Lets say I find space for MyType at offset 28 new (buffer + 28) MyType; return 28; } void destroyMyType(unsigned long long idx) { ((MyType*)(buffer + idx))->~MyType(); } int main() { }

如果C++;禁止你记忆某些类型? 我写了一些东西来分配对象/内存,我遇到了一个问题,因为C++似乎禁止移动类型,而不是简单的可复制的。我假设有时内存分配器需要移动内存,如果它这样做,就不能返回直接指针或直接句柄,而是返回指向索引的间接指针或句柄,这些指针或句柄可以在内存移动时更改。我猜这就是内存碎片整理/压缩时所做的,但是当C++禁止我对特定对象进行记忆时,我如何移动内存呢?例如: char* buffer = new char[128]; unsigned long long createMyType() { // Lets say I find space for MyType at offset 28 new (buffer + 28) MyType; return 28; } void destroyMyType(unsigned long long idx) { ((MyType*)(buffer + idx))->~MyType(); } int main() { },c++,memory,object-lifetime,C++,Memory,Object Lifetime,不管出于什么原因,我想移动缓冲区的某一部分,以缩小一个间隙(或其他)。我很确定我不能记忆有MyType对象的区域,因为它不是可复制的,也可能因为它不是隐式的生命周期类型。如果不知道内存中存在的对象,内存是如何移动的?我已经读过,不能记忆某些类型的一个原因是,不可复制和非标准布局类型不能保证在内存中是连续的。但我真的不明白为什么它不能是连续的。如果可能的话,它是不连续的,像操作系统这样的东西怎么能移动内存呢?我不能用对象填充缓冲区,移动内存并期望它具有相同的数据/对象吗?< /P> C++内存分配

不管出于什么原因,我想移动缓冲区的某一部分,以缩小一个间隙(或其他)。我很确定我不能记忆有MyType对象的区域,因为它不是可复制的,也可能因为它不是隐式的生命周期类型。如果不知道内存中存在的对象,内存是如何移动的?我已经读过,不能记忆某些类型的一个原因是,不可复制和非标准布局类型不能保证在内存中是连续的。但我真的不明白为什么它不能是连续的。如果可能的话,它是不连续的,像操作系统这样的东西怎么能移动内存呢?我不能用对象填充缓冲区,移动内存并期望它具有相同的数据/对象吗?< /P> C++内存分配器不能移动活内存,只有空闲内存。你的担心是没有根据的。@user207421你能解释一下你所说的实时记忆是什么意思吗?您可以请求内存,用数据填充内存,然后移动内存。你所说的“活”记忆是什么意思?你想记忆还是移动?在C++中移动某件东西意味着一些非常具体的东西,我不认为你实际上是在问这个问题。@ SuffiSy我想把缓冲区从一个地方移到另一个地方,MeMCPY在技术上是一个拷贝,但是我将缓冲区从一个区域移到另一个区域,因为我对旧数据不感兴趣。缓冲区中可以有任何内容。但我不能这么做,因为某些类型不是很容易复制的,而且memcpy不能用于这些类型。我不明白为什么禁止这样做。通常,对于非平凡的可复制类型来说,memcpy不是一个好主意的原因是,如果定义了移动或赋值运算符,memcpy不会正确地复制/移动对象,因为它…非平凡类型的一个简单示例是在对象内保存指向其自身成员变量之一的指针或引用。类型应定义运算符,以便在复制/移动/指定对象时执行正确的操作。如果有这样一个对象,内部指针会指向错误的位置,这对memcpy来说将是一场灾难。您不应该按位复制它并改正C++代码,标准库不会按位复制它,因为它不是一个普通的类型。中的答案可能会有所帮助。