Hi Kenton, Got it, it makes sense. So if I remove `labelString` data from the definition, I could use truncate function to operate my detections @4 :List(Detection2d); object. Thanks!
On Tuesday, 6 December 2022 at 10:43:17 pm UTC+8 [email protected] wrote: > Hi Hui, > > Again sorry for the slow reply. > > In fact, the functionality you suggest does exist today, in the form of > `capnp::Orphan<T>::truncate()`, which can be used to resize a list > (truncate *or* extend), doing so in-place if possible. If the list is at > the end of the message, it's possible it can be extended in-place. To use > it, you would do: > > ``` > auto orphan = reader.disownDetections(); > orphan.truncate(newSize); > reader.adoptDetections(kj::mv(orphan)); > ``` > > HOWEVER, there is a problem that might apply to your sample use case: Your > `Detection2d` struct contains `labelString @1 :Text`, which is a pointer > type. When you set this field to a string value, the string is allocated at > the end of the message. This means your list is *not* at the end of the > message anymore, so you are no longer able to resize the list to make it > longer. To be able to extend your list, you will need the list to contain > only primitive types, so that it stays at the end of the message. > > -Kenton > > On Sat, Nov 5, 2022 at 9:16 PM Hui min <[email protected]> wrote: > >> Hi Cap'n Proto Team, >> >> Thanks for the amazing tool you have created so far. >> >> Understand that with the current design of arena style memory allocation, >> we cannot simply reuse the message, and re-init List() object to send it >> again. This will cause the message to grow every time we send (memory leak). >> >> However, sending variable length data is still pretty common practice. If >> we have to reallocate a brand new heap for new message, it is quite >> wasteful. In most cases however, the variable length list is just one. So I >> have an idea. >> >> ``` >> struct Detection2d { >> >> labelIdx @0 :UInt32; >> labelString @1 :Text; >> xmin @2 :Float32; >> xmax @3 :Float32; >> ymin @4 :Float32; >> ymax @5 :Float32; >> confidence @6 :Float32; >> >> } >> >> struct Detections2d { >> >> header @0 :import "header.capnp".Header; >> >> imageData @1 :Data; # should be RGB >> >> width @2 :UInt32; >> height @3 :UInt32; >> >> detections @4 :List(Detection2d); >> } >> ``` >> >> In this case, I have put the variable length object at the vary last. >> That means everything in front is fix length. Is there a way i could force >> the Capnproto to discard the memory of the old List and create a new one >> directly from its old memory location, with out leaking a chunk of memory >> in the arena? >> >> If it is not currently possible, do you think it is a convenient function >> to be added? Thanks! >> >> -- >> You received this message because you are subscribed to the Google Groups >> "Cap'n Proto" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to [email protected]. >> To view this discussion on the web visit >> https://groups.google.com/d/msgid/capnproto/c500ece7-1871-4015-ba78-f456365a8bc3n%40googlegroups.com >> >> <https://groups.google.com/d/msgid/capnproto/c500ece7-1871-4015-ba78-f456365a8bc3n%40googlegroups.com?utm_medium=email&utm_source=footer> >> . >> > -- You received this message because you are subscribed to the Google Groups "Cap'n Proto" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To view this discussion on the web visit https://groups.google.com/d/msgid/capnproto/f92d55a5-9382-4e07-9d4d-f8a6f5766771n%40googlegroups.com.
