I'm far from an expert on the runtime. But I believe one condition under which this breaks is if `T` contains pointers (including pointer-like types, e.g. `string`, `map`, `[]T`…). The GC needs to know which memory contains pointers. If `T` is e.g. `*int` You are spreading a pointer over [N]byte (which is assumed to have no pointers) and an *int, meaning you both have a pointer where none is expected and store nonsense in a pointer. My understanding is, that you violate the "equivalent memory layout"part of the unsafe.Pointer rules <https://pkg.go.dev/unsafe#Pointer>.
On Wed, 11 Jun 2025 at 19:14, Timur Celik <clk...@gmail.com> wrote: > Sorry, I think the code needs more explanation: A value of type > Aligned[T,A] will allocate enough memory to contain one instance of T with > alignment A. The fields pad and val will contain only garbage, they only > exist for allocating enough memory and could as well be a byte array. To > get the aligned value ot T, the Value() method must be called. It returns > an aligned pointer inside the pad field and casts it to *T. See the > playground example: > > https://go.dev/play/p/qLvE5XY82h6 > > One more thing worth noting, by allowing only alignments larger than Go > max alignment of 8 byte, it's ensured that T has still the alignment > gurantees that Go itself expects. > > Mikk Margus schrieb am Mittwoch, 11. Juni 2025 um 18:07:18 UTC+2: > >> Oh, yeah, you're right, that does seem to be the intent. >> >> From what I know, and based on the documentation I linked before[1], >> you can, at most, get 32-bit alignment on 32-bit platforms and 64-bit >> alignment on 64-bit platforms with Go. At least with this approach. >> For in-memory size/alignment purposes, an array type [N]T is equivalent >> to just having N discrete attributes of type T on the struct. >> >> Which is to say, an array of 64 bytes does not increase your alignment >> above 1 byte, and the best you'll get is an alignment of 8 bytes via >> uint64, assuming you're on a 64-bit platform, and only 4 bytes on a >> 32-bit platform. And [2]uint64 would not fare any better. >> >> Also, I appear to have accidentally veered off-list for this discussion >> with Robert Engels, my apologies. >> >> >> [1] https://go.dev/s/regabi >> >> On 6/11/25 17:00, Robert Engels wrote: >> > I don’t think so - it a “64 BYTE aligned” to prevent false sharing - >> > according to the original code. >> > >> >> On Jun 11, 2025, at 8:39 AM, Def Ceb <mikk....@gmail.com> wrote: >> >> >> >> >> >> To get a n-bit-aligned pointer (where n is 16 or 64) to an arbitrary >> >> value using generics, is it not? >> >> >> >> On Wed, Jun 11, 2025, 16:36 Robert Engels <ren...@ix.netcom.com >> >> <mailto:ren...@ix.netcom.com>> wrote: >> >> >> >> It depends on what the OP is trying to align… eg is it to prevent >> >> false sharing? >> >> >> >>> On Jun 11, 2025, at 8:14 AM, Def Ceb <mikk....@gmail.com >> >>> <mailto:mikk....@gmail.com>> wrote: >> >>> >> >>> >> >>> https://go.dev/s/regabi <https://go.dev/s/regabi> >> >>> I believe this is true. The arrays of bytes would not enforce >> >>> alignment any tighter than that of one byte. Replacing the >> >>> aliases of Align16 and Align64 from byte arrays to uint16/uint64 >> >>> would fix this. >> >>> >> >>> On Wed, Jun 11, 2025, 15:47 Robert Engels <ren...@ix.netcom.com >> >>> <mailto:ren...@ix.netcom.com>> wrote: >> >>> >> >>> I don’t think the code works at all - at least not from an >> >>> alignment perspective. For instance, assume T is one byte, >> >>> and you use align 64, it is aligned on 65 byte boundaries. >> >>> (This may not be fully correct need to read spec on structure >> >>> member alignment - but the gist should be true) >> >>> >> >>>> On Jun 10, 2025, at 10:04 AM, Timur Celik <clk...@gmail.com >> >>>> <mailto:clk...@gmail.com>> wrote: >> >>>> >> >>>> >> >>>> Consider the following generic type, which ensures to be >> >>>> large enough by allocating enough padding A and the to-be- >> >>>> aligned type T: >> >>>> >> >>>> type Alignment interface { >> >>>> Align16 | Align64 >> >>>> } >> >>>> type Align16 = [16]byte >> >>>> type Align64 = [64]byte >> >>>> >> >>>> type Aligned[T any, A Alignment] struct { >> >>>> pad A >> >>>> val T >> >>>> } >> >>>> >> >>>> func (p *Aligned[T, A]) Value() *T { >> >>>> size := unsafe.Sizeof(*new(A)) >> >>>> align := size - uintptr(unsafe.Pointer(&p.pad[0]))&(size-1) >> >>>> return (*T)(unsafe.Pointer(&p.pad[align])) >> >>>> } >> >>>> >> >>>> Under the assumption that T has no heap pointers, is this >> >>>> safe? Or asked in another way, under which circumstances >> >>>> would this break? >> >>>> >> >>>> -- >> >>>> You received this message because you are subscribed to the >> >>>> Google Groups "golang-nuts" group. >> >>>> To unsubscribe from this group and stop receiving emails >> >>>> from it, send an email to golang- >> >>>> nuts+uns...@googlegroups.com <mailto:golang- >> >>>> nuts+uns...@googlegroups.com>. >> >>>> To view this discussion visit https://groups.google.com/d/ >> >>>> msgid/golang-nuts/d00058ec- >> >>>> cb9b-495f-807d-54397be94df2n%40googlegroups.com <https:// >> >>>> groups.google.com/d/msgid/golang-nuts/d00058ec- >> >>>> cb9b-495f-807d-54397be94df2n%40googlegroups.com? >> >>>> utm_medium=email&utm_source=footer>. >> >>> >> >>> -- >> >>> You received this message because you are subscribed to the >> >>> Google Groups "golang-nuts" group. >> >>> To unsubscribe from this group and stop receiving emails from >> >>> it, send an email to golang-nuts...@googlegroups.com >> >>> <mailto:golang-nuts...@googlegroups.com>. >> >>> To view this discussion visit https://groups.google.com/d/ >> >>> msgid/golang-nuts/D368E0E8- >> >>> DE85-43D3-813E-60D359578DF8%40ix.netcom.com <https:// >> >>> groups.google.com/d/msgid/golang-nuts/D368E0E8- >> >>> DE85-43D3-813E-60D359578DF8%40ix.netcom.com? >> >>> utm_medium=email&utm_source=footer>. >> >>> >> >> -- > You received this message because you are subscribed to the Google Groups > "golang-nuts" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to golang-nuts+unsubscr...@googlegroups.com. > To view this discussion visit > https://groups.google.com/d/msgid/golang-nuts/7b9b2598-f39b-4980-889c-36353c5aa34cn%40googlegroups.com > <https://groups.google.com/d/msgid/golang-nuts/7b9b2598-f39b-4980-889c-36353c5aa34cn%40googlegroups.com?utm_medium=email&utm_source=footer> > . > -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. To view this discussion visit https://groups.google.com/d/msgid/golang-nuts/CAEkBMfHK%2BP4JiW15eKe%3De1pES6rMWkm%3DjRTQbV3x1u_jkRvM-w%40mail.gmail.com.