Вверх ↑
Ответов: 5446
Рейтинг: 323
#1: 2012-03-30 18:58:12 ЛС | профиль | цитата
Хоть я и не профессиональный программист, но кое-что разъяснить могу.

В C (C++) память выделяется непрерывным блоком не из-за лени авторов языка, а исключительно для быстродействия. "Массивов" в C вообще говоря нет - есть лишь "арифметика указателей". Поэтому получение i-го элемента массива в таком случае сводится к двум арифметическим операциям и одному обращению к памяти. Вычисление размера одного элемента (sizeof) происходит в compile-time, и в конечном коде является константой. Арифметика (сложение и умножение, в нашем случае) - это очень быстрая операция. А если компилятор хотя бы минимально умный, то эти промежуточные вычисления будут использовать регистры процессора (а не опреативную память). Все эти ухищрения становятся понятны, если вспомнить, что язык C был создан для написания операционных систем. Однако платой за быстрые чтение/запись является медленное расшириение массива: n чтений из памяти, n записей в память, n сравнений, 4*n арифметических операций (примерно, я мог чего-то и не учесть).

Однако не всё так плохо - в C++ есть STL (Standard Template Library - стандартная библиотека шаблонов), которая позволяет работать с "массивами" примерно с такой же лёгкостью, как в Pascal-е. Платой за это будет бОльший размер программы (ибо тащим за собой код, обеспечивающий ту самую простоту) и меньшее быстродействие (ибо ООП).

Если, как предлагает nesco, организовывать память в виде списка (если я правильно помню, то наш MT - это классический односвязный список), то получаем медленный (относительно) произвольный доступ: для получения i-го элемента мы обязаны прочитать все предшествующие элементы - это i обращений к памяти. Зато изменение размера такого массива происходит достаточно быстро (выделение места + запись одного указателя).

Короче говоря, holy war тут разводить бесполезно: каждый язык хорош для своих целей.
карма: 1

1
Голосовали:login