2012-02-14 2 views
1

Я часто использую, чтобы запомнить все матрицы в одном векторе, потому что в моей книге говорится, что быстрее использовать один вектор. И доступ к матрице медленнее во времени. Если у меня есть код, подобный этому:Матрицы в смежном положении памяти

int main(int argc, char **argv) 
{ 
    int mat[10][10],i; 
    for(i=0;i<10;i++) 
     mat[i][0]=99; 
    int *ptr=&mat[0][0]; 
    for(i=0;i<10;i++) 
    { 
     printf("%d\n",*ptr); 
     ptr+=10; 
    } 
    return 0; 
} 

Я попытался запустить его 4/5 раз и все время печатает 10 раз 99. Так же матрицы запоминаются в contigous позиции памяти? Всегда? Если да, то почему доступ к вектору быстрее?

+0

Можете ли вы уточнить, что вы подразумеваете под «матрицей» и «вектором»? Я ответил как мог, но я просто догадываюсь, что вы имеете в виду, основываясь на вашей примерной программе. –

+0

2D массивы и 1D массивы. –

ответ

1

Ну, массивы (в C) хранятся в непрерывной памяти, и с тех пор ваш mat является массивом массивов, он также сохраняется в смежной памяти. Я думаю, что разыменование по одному индексу (когда у вас есть отдельные разделительные массивы 1D) может быть немного быстрее разыменования двумя индексами (в матрице), но разница слишком мала, чтобы беспокоиться.

+0

Если вы собираетесь эмулировать 2D-массив с 1D-массивом, вам все равно придется вычислять индекс. Независимо от того, выполняете ли вы это явно или компилятор, похоже, что это, вероятно, не имеет никакого значения. –

+0

Я понял из вопроса, что у него есть некоторые несвязанные массивы 1D, и он хочет имитировать их одним 2D-массивом. В этом случае компилятор не может вычислить первый индекс. (подумайте о vla) – asaelr

2

Если «матрица» означает двумерный массив, то да, они находятся в непрерывной памяти. 2D-массивы в C - это просто массивы массивов (ряд основных). Если по вектору вы имеете в виду 1D-массив, тогда нет причин, по которым он должен быть быстрее, чем доступ к 2D-массиву.

1

C не имеет многомерных массивов как и в других языках, он назвал их многомерного но они действительно массивы массивов.

И массивы C являются смежными.

(C99, 6.2.5p20) «Тип массива описывает смежно выделенный непустой набор объектов с определенным типом объекта-члена, называемым типом элемента».

Смежные вопросы