Это очень широкий вопрос, и в нем есть много частей.Во-первых, это относительно языка, на котором вы работаете. Давайте возьмем Java в качестве примера.
Когда вы создаете объект, он наследуется от класса основного объекта.Когда объект создается, накладные расходы связаны с тем, что пользовательский класс наследуется от Object
.Компилятор должен виртуализировать определенные вызовы методов в памяти, чтобы при вызове .equals()
или .toString()
программа знала, какой из них вызывать (т. Е. Ваши классы '.equals()
или Object
' .equals()
),Это выполняется с помощью таблицы поиска и определяется во время выполнения с помощью указателей.
Это называется виртуализацией.Теперь в Java массив на самом деле является объектом, так что вы действительно мало что получаете от массива массивов.Фактически, вы могли бы лучше использовать свой собственный класс, поскольку вы можете ограничить связанные с ним метаданные.Массивы в java хранят информацию об их длине.
Однако многие из коллекций имеют накладные расходы, связанные с ними.ArrayList
например, изменит свой размер и сохранит метаданные о себе в памяти, которые вам могут не понадобиться.LinkedList
имеет ссылки на другие узлы, что накладные расходы на его фактические данные.
Теперь то, что я сказал, верно только в отношении Java.В других языках ОО объекты ведут себя по-разному, а некоторые могут быть более / менее эффективными.
На таком языке, как C ++, когда вы выделяете массив, вы на самом деле просто получаете кусок памяти, и вам решать, что вы хотите с ним делать.В этом смысле это может быть лучше.С ++ имеет аналогичные накладные расходы со своими объектами, если вы используете переопределение (ключевое слово virtual
), поскольку оно будет создавать эти виртуальные поиски в памяти.