1. Yes, it would create an array of pointers.
2. Yes, it would worsen performance.
3. Try using a Tuple, e.g.
julia> immutable Dual{T1,T2,N}
x::T1
dx::NTuple{N,T2}
end
julia> Dual(1.0, (2.0, 3.0))
Dual{Float64,Float64,2}(1.0,(2.0,3.0))
I think this will be stored "flat" but I'm not 100% sure.
On Thursday, July 31, 2014 2:45:27 AM UTC-4, Philippe Maincon wrote:
>
> Hi,
>
> Say I create a multidimensional array "a" and I have defined the type
>
>
> immutable Dual{T1,T2} # immutable: fields are read only, except by constructor
>
> x ::T1 # think of this as a Float for this discussion
>
> dx::T2 # Vector{Float}
>
> end
>
>
> (yes, I am playing with automatic differentiation) Then I want to do the
> following allocation:
>
>
> b = Array(Dual{Float64, Array{Float64,ndims(a)}} ,size(a)...)
>
>
> So I want an array of "structures", each having as field a Float, and an
> Array. This would be accessed as b[i].x and b[i].dx[j]
>
> Now my intention is that all these dx array *have the same size*, which
> opens for packed storage, without any use of pointers by the compiler. This,
> I understand is what "immutable" is for, and is exploited, implicitly, in
> Complex.jl. However, in my declaration above, I do not spec the size of the
> dx's, and sothis will compile, I believe, into an array of x's and pointer to
> dx's, and I expect suboptimal performance.
>
>
> 1. Am I right that this would compile into an array of pointers?
> 2. If yes, am I right that this would cause poor performance? (think of
> Complex,jl, you really want things to go fast, there)
> 3. If yes, is there a way to allocate b that ensures "packed storage"?
>
>
> Thank you beforehand for your answer, but most of all, thank you for Julia!
>
>
> Philippe
>
>