【发布时间】:2017-12-05 09:54:16
【问题描述】:
我目前正在使用 C++ 编写自定义分配器。这个分配器必须通过移动内存和对象来定期对其内存进行碎片整理。这些移位总是向下的,这意味着移动的内存块的地址在移动时总是减少。当旧内存块和新内存块不重叠时,这样做没有问题。如果它们重叠,我首先必须将对象移动到分配器内存之外的临时区域,然后将其移回新的内存块。
如果移动类型的 std::is_trivially_move_constructible 为真,那么如果默认移动构造函数内的赋值顺序定义明确,我可能会将这个额外的移动保存到临时内存块中。这引出了我的问题:分配的顺序是明确定义的还是特定于平台的?
【问题讨论】:
-
不能手动移动任何这样的对象,例如std::memmove?
-
您指的是哪些“作业”?
-
从技术上讲,数据成员是按照它们在类定义中列出的顺序构造的。这可能与它们在内存中的排列顺序相同,也可能不同;该顺序仅在具有相同访问权限的成员之间得到保证。实际上,在 as-if 规则下,一个简单的复制/移动构造函数可能会退化为
memcpy调用或类似调用。即便如此,编译器理论上可以从前到后,或从后到前,或先复制奇数字节然后复制偶数字节;我不认为这种假设的实现是不合规的。 -
"此分配器必须定期对其内存进行碎片整理,方法是移动内存和对象。" 嗯,你真的不能这样做。除非您完全了解这些对象中的哪些值是指针,哪些不是。仅供参考:指针可以存储在整数值中。如果您移动一个对象,而不调整指向该内存的所有内容的值,那么您已经破坏了某些东西。
-
使用 memmove 的垃圾收集已被证明很慢。你可能走错了路,小心。
标签: c++ memory move-semantics allocator move-constructor