Массивы ALLOCATABLE или Массивы указателей?

Я пишу новый код в Фортране и колеблюсь между использованием allocatable массивов или массивов указателей. Я считал где-нибудь, что allocatable массивы имеют значительные преимущества перед массивами указателей:

1) Более эффективный, потому что они всегда непрерывны в памяти

2) Никакие утечки памяти не возможны

Кто-то может подтвердить это? Какому Вы советовали бы для использования? Каковы результаты с точки зрения скорости выполнения кода между этими двумя альтернативами?

12
задан Vladimir F 8 December 2015 в 10:28
поделиться

1 ответ

Самый первый вопрос, который вы должны задать себе:

  • Пользуюсь ли я официально поддерживаемым дистрибутивом Linux?

Если нет, переключитесь на тот, который есть.

Сообщите об этом Sun!

-121--2991063-

Вместо этого используйте соединения:

SELECT records.id
FROM records
JOIN data AS D1 ON records.firstname = D1.id
JOIN data AS D2 ON records.lastname = D2.id
WHERE D1.value = 'john' and D2.value = 'smith'

Вот некоторые тестовые данные:

CREATE TABLE records (id INT NOT NULL, firstname INT NOT NULL, lastname INT NOT NULL);
INSERT INTO records (id, firstname, lastname) VALUES
(1, 1, 1),
(2, 1, 2),
(3, 2, 1),
(4, 2, 2);

CREATE TABLE data (id INT NOT NULL, value NVARCHAR(100) NOT NULL);
INSERT INTO data (id, value) VALUES
(1, 'john'),
(2, 'smith');

Ожидаемый результат:

2

Тестовые данные, вероятно, не полезны для плаката, но могут быть полезны для избирателей, которые хотят проверить решения, чтобы убедиться, что они работают правильно, или людей, которые хотят представить ответы, чтобы они могли проверить свои собственные ответы.

-121--2076074-

Распределение массивов может привести к повышению эффективности кода, поскольку массивы будут смежными. В частности, если массив передается подпрограмме, то его непрерывность может предотвратить необходимость создания компилятором временной копии.

Для локальных переменных в подпрограммах (без атрибута SAVE) (для Fortran 95 и выше) распределяемые массивы автоматически освобождаются при выходе из подпрограммы, избегая утечки памяти. Утечки памяти невозможны с выделяемыми объектами, за исключением того, что программист не освобождает массив, который больше не нужен.

С помощью указателей можно переназначить указатель, оставив часть памяти недоступной и потерянной - одна из форм утечки. Если распределяемый будет выполнять задание, я рекомендую использовать этот метод вместо указателя.

Некоторые причины использования указателей: получение раздела массива или создание структуры данных, такой как связанный список. Для создания массива размера, определенного во время выполнения, я бы использовал распределяемый.

20
ответ дан 2 December 2019 в 18:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: