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.

Reply via email to