Whoops, the last line should be pages_span(storage, ...) On Sun, Dec 11, 2022 at 8:38 AM Gavin Ray wrote: > @Richard > > That's some intense code, I appreciate the code-samples and explanation, > thank you =) > > @Jonathan > > Maybe there was some misunderstanding? > I didn't make the connection either but I also don't know that much about > C++ > > It seems like that expression is valid then? Good to know =) > > As a random aside if I may -- what is the difference between placement-new > of pointers in > std::byte storage, and making a std::span over the storage area? > > std::byte storage[PAGE_SIZE * NUM_PAGES]; > > // A) > page* pages = new (storage) page[NUM_PAGES]; > // B) > std::span pages_span(pages, NUM_PAGES); > > > On Sun, Dec 11, 2022 at 8:31 AM Richard Biener > wrote: > >> On Sun, Dec 11, 2022 at 1:02 PM Jonathan Wakely >> wrote: >> > >> > >> > >> > On Sun, 11 Dec 2022, 09:12 Richard Biener, >> wrote: >> >> >> >> On Sat, Dec 10, 2022 at 7:45 PM Andrew Pinski via Gcc >> wrote: >> >> > >> >> > On Sat, Dec 10, 2022 at 10:36 AM Jonathan Wakely via Gcc >> >> > wrote: >> >> > > >> >> > > On Sat, 10 Dec 2022 at 17:42, Gavin Ray via Gcc >> wrote: >> >> > > > >> >> > > > This came up when I was asking around about what the proper way >> was to: >> >> > > > >> >> > > > - Allocate aligned storage for a buffer pool/page cache >> >> > > > - Then create pointers to "Page" structs inside of the storage >> memory area >> >> > > > >> >> > > > I thought something like this might do: >> >> > > > >> >> > > > struct buffer_pool >> >> > > > { >> >> > > > alignas(PAGE_SIZE) std::byte storage[NUM_PAGES * PAGE_SIZE]; >> >> > > > page* pages = new (storage) page[NUM_PAGES]; >> >> > > > } >> >> > > > >> >> > > > Someone told me that this was a valid solution but not to do it, >> because it >> >> > > > wouldn't function properly on GCC >> >> > > > They gave this as a reproduction: >> >> > > > >> >> > > > https://godbolt.org/z/EhzM37Gzh >> >> > > > >> >> > > > I'm not experienced enough with C++ to grok the connection >> between this >> >> > > > repro and my code, >> >> > > >> >> > > Me neither. I don't think there is any connection, because I don't >> >> > > think the repro shows what they think it shows. >> >> > > >> >> > > > but I figured >> >> > > > I'd post it on the mailing list in case it was useful for >> others/might get >> >> > > > fixed in the future =) >> >> > > > >> >> > > > They said it had to do with "handling of lifetimes of >> implicit-lifetime >> >> > > > types" >> >> > > >> >> > > I don't think that code is a valid implementation of >> >> > > start_lifetime_as. Without a proper implementation of >> >> > > start_lifetime_as (which GCC doesn't provide yet), GCC does not >> allow >> >> > > you to read the bytes of a float as an int, and doesn't give you >> the >> >> > > bytes of 1.0f, it gives you 0. >> >> > > >> >> > > https://godbolt.org/z/dvncY9Pea works for GCC. But this has >> nothing to >> >> > > do your code above, as far as I can see. >> >> > >> >> > See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107115#c10 for what >> >> > is going wrong. >> >> > Basically GCC does not have a way to express this in the IR currently >> >> > and there are proposals there on how to do it. >> >> >> >> I wouldn't call them "proposals" - basically the C++ language providing >> >> holes into the TBAA system is a misdesign, it will be incredibly >> difficult >> >> to implement this "hole" without sacrifying optimization which means >> >> people will complain endlessly why std::start_lifetime_as isn't a way >> >> to circumvent TBAA without losing optimization. >> > >> > >> > People already make holes in the type system, this just lets them do it >> without UB. If it's not as fast as their UB, that's ok IMHO. >> > >> > >> > >> > But I don't see what start_lifetime_as has to do with the original >> problem anyway. The placement new expression will start lifetimes: >> > >> > page* pages = new (storage) page[NUM_PAGES]; >> > >> > There's no need to mess with the type system here. >> >> That's true, and that should work, not sure what the problem should be >> here. >> >> Richard. >> >> > >> > >> >