Из стандарта C ++, ссылаясь на оператор sizeof
:
При применении к массиву результатом является общее количество байтов в массиве. Это означает, что размер массива n
элементов в n
раз превышает размер элемента.
Исходя из этого, я бы сказал, что double[4][4]
и double[16]
должны иметь одинаковое базовое представление.
Т.е., дано
sizeof(double[4]) = 4*sizeof(double)
и
sizeof(double[4][4]) = 4*sizeof(double[4])
тогда у нас есть
sizeof(double[4][4]) = 4*4*sizeof(double) = 16*sizeof(double) = sizeof(double[16])
Я думаю, что совместимый со стандартами компилятор должен был бы реализовать их одинаково, и я думаю, что это не то, что компилятор случайно сломал бы. Стандартный способ реализации многомерных массивов работает, как и ожидалось. Нарушение стандарта потребовало бы дополнительной работы, вероятно, без выгоды.
Стандарт C ++ также гласит, что массив состоит из смежно расположенных элементов, что исключает возможность делать что-либо странное с помощью указателей и отступов.