Да, это как-то связано с распределением памяти. Первый цикл индексирует внутреннее измерение img
, которое каждый раз занимает только 3 байта. Это легко в пределах одной страницы памяти (я думаю, что общий размер здесь составляет 4 КБ для одной страницы). Но с вашей второй версией индекс внешнего измерения быстро меняется. Это приведет к тому, что чтения памяти распространятся на гораздо больший диапазон памяти, а именно sizeof (char[IMGX][3])
байта, что составляет 24 КБ. И с каждым изменением внутреннего индекса эти скачки начинают происходить снова. Это будет попадать на разные страницы и, вероятно, будет немного медленнее. Также я слышал, что процессор читает впереди памяти. Это принесет пользу первой версии, потому что во время чтения эти данные, вероятно, уже находятся в кэше. Я могу представить себе, что вторая версия от этого не выигрывает, потому что она делает большие скачки по памяти взад-вперед.
Я подозреваю, что разница не так уж велика, но если алгоритм запускается много раз, он в конечном итоге становится заметным. Вы, вероятно, хотите прочитать статью Row-major Order
в Википедии. Это схема, используемая для хранения многомерных массивов в C.