var arr {.align(256).}: MyArr
    var obj {.align(256).}: MyObj
    
    
    Run

I think this means references (or pointers) `arr` and `obj` are aligned, not 
objects these references point are aligned.
    
    
    type
      MyArr = ref array[4, int]
      MyObj = ref object
      MyArrObj = ref object
        arr {.align(256).}: array[4, int]
    
    var arr {.align(256).}: MyArr
    var obj {.align(256).}: MyObj
    var arrObj: MyArrObj
    
    arr = new MyArr         # not aligned
    obj = new MyObj         # not aligned
    arrObj = new MyArrObj   # arrObj.arr is aligned
    
    echo cast[uint](arr.addr).toHex   # aligned
    echo cast[uint](obj.addr).toHex   # aligned
    
    echo cast[uint](arr).toHex        # not aligned
    echo cast[uint](obj).toHex        # not aligned
    
    
    Run

As adding align pragma to a type is compile error, it seems defining an object 
type and adding the pragma to the field is the only way to align referenced 
object or array.
    
    
    type
      MyObj2 {.align(256).} = object          # invalid pragma: align(256)
      MyObj2Ref = ref MyObj2
      MyArray {.align(256).} = array[4, int]  # invalid pragma: align(256)
      MyArrayRef = ref MyArray
    
    
    Run

Reply via email to