On Tue, Aug 21, 2018 at 4:08 PM, 'Carl Mastrangelo' via golang-nuts
<golang-nuts@googlegroups.com> wrote:
>
> The answer must be more nuanced than that, because it is possible to take a
> nil pointer and construct an unsafe.Pointer from it.

Yes, OK, nil is an exception, as it is for any pointer type.


> The reason I am interested in this is (and please don't judge too early) is
> I'm toying around with implementing some atomic primitives.  In particular,
> I would like to play around with with the cmpxchg16b instruction which needs
> 16 byte alignment.   Go does not provide a way to enforce a data structure
> has such alignment, so I am attempting to define a struct that I can index
> into.  (assume 64bit words).  For example, the datastructure I want is this:
>
> // alignment of foo is 16
> type foo struct {
>   uintptr
>   unsafe.Pointer
> }
>
> But I can't assert this.  The next best thing is to make a struct 2x the
> size, and make a pointer to the first aligned part:
>
> type foo struct {
>   [4]uintptr
> }
>
> This way I can get an aligned address pointing into the middle of this array
> for using cmpxchg16b.   The problem with this is that if any of the interior
> values are not seen a pointers by the GC.  In order to keep the values alive
> they need to be unsafe.Pointer:
>
> type foo struct {
>   [4]unsafe.Pointer
> }
>
> Now this is a problem.  There is really only one pointer in here, the other
> value is just some arbitrary bytes.  Since the GC now things the addresses
> are real, it will crash.  What is the correct way to get an aligned struct
> that contains pointers?

There isn't one.  There is some discussion at https://golang.org/issue/19057 .

Ian

-- 
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.
For more options, visit https://groups.google.com/d/optout.

Reply via email to