代码之家  ›  专栏  ›  技术社区  ›  Brotcrunsher

默认移动构造函数中的赋值顺序是什么?

  •  2
  • Brotcrunsher  · 技术社区  · 7 年前

    我目前正在使用c++开发一个自定义分配器。这个分配器必须通过移动内存和对象来定期对其内存进行碎片整理。这些移位总是向下的,这意味着移动的内存块的地址在移动时总是减少。当旧内存块和新内存块不重叠时,这样做没有问题。如果它们重叠,我首先必须将对象移动到分配器内存之外的临时区域,然后将其移回新的内存块。

    如果std::is\u minalily\u move\u constructible对于移动类型为true,那么如果默认移动构造函数中的赋值顺序定义良好,我可能会将此额外移动保存到临时内存块。这就引出了我的问题:任务的顺序是定义得很好还是特定于平台?

    2 回复  |  直到 7 年前
        1
  •  2
  •   HeroicKatora    7 年前

    来自标准(第15.8.1节[类别副本])

    (14) 非联合类X的隐式定义的复制/移动构造函数 执行其基和成员的成员级复制/移动。[注: 忽略非静态数据成员的默认成员初始值设定项。 另见15.6.2中的示例。结束注释]顺序 用户定义构造函数中的成员(见15.6.2)

    通过链接,我们可以

    (13.3)然后,按照非静态数据成员的顺序初始化它们 在类定义中声明(同样不考虑顺序


    虽然没有很好地回答这个问题,但正如伊戈尔·坦德尼克(Igor Tandetnik)在他的回答中所说,将一个微不足道的构造函数转换为 std::memmove

        2
  •  0
  •   Igor Tandetnik    7 年前

    对于任何可复制的类型 T ,如果两个指针指向 指向distinct 物体 obj1 obj2 obj1 也没有 是基类子对象,如果底层字节(1.7)组成 obj1 被复制到 , obj1

    因此,对于一个普通的可复制类型,简单地复制字节是安全的,例如 memmove .你可以用 std::is_trivially_copyable

    是平凡可复制的必要但非充分条件:

    [类别]/6 普通可复制类 是一个类:

    (6.2)至少有一个未删除的复制构造函数、移动构造函数、复制赋值运算符或移动赋值运算符,以及

    (6.3)有一个小的、未删除的析构函数(12.4)。