【问题标题】:memcpy equivalent in DartDart 中的 memcpy 等价物
【发布时间】:2020-09-03 21:50:54
【问题描述】:

Dart 是否提供任何形式的类似 memcpy 的功能?我想将一个对象的数据浅拷贝到另一个对象的地址:

var foo = Foo("hi");
var bar = Foo("hello");

memcpy(&foo, &bar, sizeof(Foo)); 

【问题讨论】:

  • 我认为你不能考虑这个答案:/ stackoverflow.com/questions/13107906/…
  • 那个问题是关于深拷贝的。它的哪一部分回答了这个问题?
  • Dart 没有复制对象(深或浅)的功能,除非该功能已为每个类手动实现。例如。 List 支持浅拷贝,您可以在其中创建一个新的列表对象,其中包含与原始列表相同的对象实例。

标签: dart memcpy


【解决方案1】:

没有。

Dart 不允许您访问 内存,并且它无法在没有类合作的情况下浅拷贝对象。

如果你想复制一个对象,你必须使用构造函数创建一个新对象并让它填充字段。 Dart 构造函数可以做任何事情,并且某些类的构建方式依赖于维护一些连贯全局状态的构造函数。例如,一个类可以通过使用final int id = _staticCounter++; 初始化一个字段来为其对象分配连续的ID。复制该对象会破坏所有对象具有不同 ID 的不变性。

对于浅拷贝没有已知的解决方法。

对于深拷贝,有一个 hack 可以解决这个问题。如果您的平台支持dart:isolate,您可以向自己发送一个对象:

import "dart:mirrors";
Future<T> clone<T>(T value) {
  return (ReceivePort()..sendPort.send(value)).first;
}

并非所有值都可以通过发送端口发送。对于不是使用构造函数创建的对象,并非所有类都能正常工作。

【讨论】:

    猜你喜欢
    • 2010-10-05
    • 1970-01-01
    • 2022-01-24
    • 2019-03-04
    • 2014-10-08
    • 2021-10-18
    • 1970-01-01
    • 1970-01-01
    • 2018-08-07
    相关资源
    最近更新 更多