1

Тема: Статичне та динамічне виділення пам'яті для масиву з 10 елементів

Поясніть будь-ласка різницю між статичним та динамічним виділенням пам'яті для масиву конкретно з 10 елементів (тобто кількість елементів наперед вже відома):
1) int *a = new int[10];
2) int a[10];

"*" вказівник, "a" - ім'я масиву, "int" - тип , "new"  - виділення пам'яті.

Подякували: Yola1

2 Востаннє редагувалося leofun01 (20.01.2019 20:47:55)

Re: Статичне та динамічне виділення пам'яті для масиву з 10 елементів

upd: Додаю переклад:
Існує 2 способи виділити пам'ять для зберігання даних:

  1. Виділення під час компіляції (статичне)

    • Пам'ять для іменованих змінних виділена компілятором (насправді операційною системою, але інформацію про те скільки пам'яті потрібно виділити вносить компілятор)

    • Точний розмір і тип даних має бути відомим під час компіляції

    • Для стандартних оголошень масивів, ось чому розмір має бути константою (???)

  2. Динамічне виділення пам'яті

    • Пам'ять виділена "на літу" під час виконання (програми)

    • динамічно виділена область зазвичай розміщена в програмному сегменті відомому як купа (heap, free store)

    • Точний розмір області або кількість елементів не має бути відома (може бути не відома) компілятору наперед

    • Для динамічного виділення пам'яті (кеп)

Всьо, я замахався, дальше самі перекладайте.

Подякували: aassii, Yola, PRY3

3 Востаннє редагувалося Yola (20.01.2019 19:18:51)

Re: Статичне та динамічне виділення пам'яті для масиву з 10 елементів

int *a = new int[10]; // купа
int a[10]; // стек

Під час роботи програми ви можете виділити пам'ять або на стеку, або в купі. Доступ до пам'яті стеку зазвичай швидший ніж до купи. Часто потреба виділити пам"ять динамічно виникає коли розмір дуже великий, бо, наприклад в Visual Studio, розмір стека за замовчанням 1 мегабайт.

Деякі компілятори дозволяють виділяти пам'ять на стеку навіть якщо кількість елементів наперед невідома (наприклад gcc):

void f(int n) {
    int a[n];
    ...
}
ukrainian.stackexchange.com - це питання-відповіді з української мови
Подякували: aassii, 0x9111A, Arete, leofun014

4

Re: Статичне та динамічне виділення пам'яті для масиву з 10 елементів

Yola написав:

Деякі компілятори дозволяють виділяти пам'ять на стеку навіть якщо кількість елементів наперед невідома (наприклад gcc):

void f(int n) {
    int a[n];
    ...
}

А от про це паскудство краще взагалі ніколи не чути, і на всяк випадок '-Wvla' компілятору передавати.

Maybe a = Just a | Nothing

5

Re: Статичне та динамічне виділення пам'яті для масиву з 10 елементів

0x9111A, чому? C99 можна, а плюсам - зась, бо комітет гальмує?

6

Re: Статичне та динамічне виділення пам'яті для масиву з 10 елементів

Дякую! )

7

Re: Статичне та динамічне виділення пам'яті для масиву з 10 елементів

koala написав:

0x9111A, чому? C99 можна, а плюсам - зась, бо комітет гальмує?

А тому що ця "фіча" по при свою, з першого погляду, привабливість несе тільки шкоду.
Проблема в тому, що якщо пам’ять з якоїсь причини не виділиться (N завелике) то рантайм ніяк про це не повідомлється, і знайти в чому проблема буває не дуже просто.

Доречі:
https://www.phoronix.com/scan.php?page= … ls-The-VLA

Maybe a = Just a | Nothing
Подякували: leofun011

8

Re: Статичне та динамічне виділення пам'яті для масиву з 10 елементів

Ви про який рантайм? Якщо вбудований, то, цілком можливо, що так. А на Windows/Linux буде... кгм... назва популярного сайту з питаннями та відовідями про програмування :)

9 Востаннє редагувалося 0x9111A (21.01.2019 19:10:32)

Re: Статичне та динамічне виділення пам'яті для масиву з 10 елементів

koala написав:

Ви про який рантайм? Якщо вбудований, то, цілком можливо, що так. А на Windows/Linux буде... кгм... назва популярного сайту з питаннями та відовідями про програмування :)

Я маю на увазі що фейл малоку можна явно перевірити і відреагувати.
А от якщо реальний розмір VLA буде 0 то записані начебто в нього данні потраплять незрозуміло куди, і наслідки цього дадуть про себе знати незрозуміло коли і яким чином

Maybe a = Just a | Nothing