Search code examples
cvisual-c++gccclangicc

Column-major array storage in C compilers


Are there any C compilers that have extensions to store an array in column-major order instead of the standard row-major order?


Solution

  • Short answer is "No".

    Long answer is that storing an array in column-major order would break the one-to-one correspondence between array index operations and pointer arithmetics, and the way an N-dimension array is sliced into N-1 dimension arrays.

    Consider a 10x20 array stored in column-major order. This means that cells in adjacent columns would be next to each other in memory. On the other hand, converting a pointer to array element at i, j to an element pointer must work like this:

    int *p=&a[1][5];
    int *q=&a[1][6];
    p++;
    

    The standard requires that p is equal q, because the two pointers point to adjacent elements. This would not be possible if array a were stored in column-major order.

    In C you would have to write your own set of functions to work with such arrays. If you code in C++, however, you would have an option to implement your own multi-dimension array, and overload the parentheses operator () to work in a column-major order.