gpt4 book ai didi

c++ - Protobuf消息如何交叉引用?

转载 作者:行者123 更新时间:2023-12-02 10:37:05 29 4
gpt4 key购买 nike

我使用下面的protobuf消息来表示树结构

message Foo {
uint32 value = 1;
repeated Foo children = 3;
}

现在我想在一个节点上添加两个 child ,基本上
Foo foo;
Foo *c1 = foo->add_children();
Foo *c2 = foo->add_children();
c1->set_value(1);
c2->set_value(1);

因为子1和子2相同,所以复制数据会消耗大量存储空间(实际上,每个节点都有大量卫星数据),无论如何,我可以让子2成为指向子1的指针(或引用)以节省空间。例如,像下面的伪代码一样
Foo foo;
Foo *c1 = foo->add_children();
foo->add_children_with_pointer(c1); // doesn't work

最佳答案

这里有两种不同的解释方法。在实际的运输级别上,没有交叉引用的概念;有效负载将在输出中重复。

就内存表示而言;它在很大程度上将是针对实现/库的。例如,在C#版本中:您只需...再次添加相同的对象引用,它应该可以工作。但是,由于使用了arenas,C++版本的所有权模型要强大得多。您可以尝试 AddAllocated ,但我有一种直觉,即这也不起作用。 “高级内存管理”下有几项,但我不认为您的方案是受支持的方案。

附带说明一下,即使在我们的模型中两次使用相同对象的库中,我们也要记住,在反序列化数据时,我们仍然会得到两个不同的实例,而不是一个实例中两个引用相同位置-因为protobuf中没有“对象ID”(或类似名称)。从解串器的角度来看,这只是两个完全不同的对象,碰巧具有相同的内容。含义:即使您在序列化时可以正常工作;反序列化时,您的努力将不会得到尊重。因此:从很多方面来说,这都不是一个有用的尝试-毕竟,您将可能想对数据进行反序列化,并且在这一点上:您又回到了自己不想去的地方。

关于c++ - Protobuf消息如何交叉引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59831550/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com