> Another example: multidimensional arrays. In C/C++ it [...] is not flat memory space (and thus for grid applications very slow)
Can you clarify what you mean by this? A naively defined multidimensional array,
float foo[32][32] = ...
is stored in sizeof(float) * 32 * 32 = 4096 consecutive bytes of memory. There's no in-built support for array copies or broadcasting, I'll give you that, but I'm still trying to understand what you mean by "not flat memory space".
int a, b;
int arr[a][b]; // ERROR: all array dimensions except for the first must be constant
//or even:
auto arr = new int[a][b]; // ERROR: error: array size in new-expression must be constant
All you can do if you want a dynamic multidimensional array is:
int a, b;
auto arr = new int*[a];
for (int i = 0; i < a; i++) {
arr[i] = new int[b];
}
But now it's a jagged array, it's no longer flat in memory.
[disclaimer: I don’t know what I’m talking about in this comment]
Could you say like,
auto arr = new int[a*(b+1)];
int \* arr2 = (int\*)arr;
for(int i=0;i<a;i++){
arr2[i]=arr+(i*(b+1))+1;
}
and then be able to say like arr2[j][k] ?
(Assuming that an int and a pointer have the same size).
It still has to do two dereferences rather than doing a little more arithmetic before doing a single dereference, but (other than the interspersed pointers) it’s all contiguous?
But maybe that doesn’t count as being flat in memory.
You can do some trick like that, though arr2 would have to have type int** for that to work, and it wouldn't really work for an int array (though there's no real reason to store the pointers into arr inside arr itself - they could easily go into a separate place).
However, this would still mean that you need to do 2 pointer reads to get to an element (one to get the value of arr2[i], then another to get the value of arr2[i][j]). In C or Fortran or C++ with compile-time known dimensions, say an N by M array, multiArr[i][j] is a single pointer read, as it essentially translates to *(multiArr + i*M + j).
Ok, I was wrong about it not being flat, but due to lack of support from my experience it is usually not used to represent grids in a simulation, as dealing with it tends to involve loops, which may or may not be optimised away. In Fortran multidim arrays are supported so much that they are used everywhere. Even debuggers allow you to display arbitrary slices of multidim arrays in local scope.
Indeed, but they're still in the Standard, so if an implementation does them, it does them in a portable way - and gcc and Clang both support them, so there's no practical issue with access to the feature.
Can you clarify what you mean by this? A naively defined multidimensional array,
is stored in sizeof(float) * 32 * 32 = 4096 consecutive bytes of memory. There's no in-built support for array copies or broadcasting, I'll give you that, but I'm still trying to understand what you mean by "not flat memory space".