Форум программистов, компьютерный форум CyberForum.ru

не очень понял про динамическое выделение памяти. - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 5.00
manking
1 / 1 / 0
Регистрация: 28.09.2010
Сообщений: 100
04.10.2010, 19:58     не очень понял про динамическое выделение памяти. #1
У меня есть массив строк состоящий из 100 элементов
C++
1
2
string *строки;
строки = new string [100];
Но при использовании я не знаю сколько всего элементов массива будет задействовано.
то есть может быть только 2 значения
C++
1
2
строки[3] = "предложение 1";
строки[44] = "предложение 2";
1) При динамическом выделении памяти для массива в данном случаи,
общий размер массива будет равен размеру этих 2 элементов или в любом случаи для всех 100 элементов будет выделена память?

2) Что если элементов в массиве, станет больше чем прописано? Можно ли будет расширить массив?

Еще читал что нужно использовать векторы, но я еще STL не изучал.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.10.2010, 19:58     не очень понял про динамическое выделение памяти.
Посмотрите здесь:

C++ Динамическое выделение памяти
Динамическое выделение памяти C++
C++ Динамическое выделение памяти
C++ Динамическое выделение памяти
C++ Распределение памяти. Динамическое выделение памяти
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
04.10.2010, 19:59     не очень понял про динамическое выделение памяти. #2
manking, string - это тоже STL.
Так что советую почитать про векторы. Благо использовать их не тяжело. Зато удобно.
manking
1 / 1 / 0
Регистрация: 28.09.2010
Сообщений: 100
04.10.2010, 20:12  [ТС]     не очень понял про динамическое выделение памяти. #3
Цитата Сообщение от Lavroff Посмотреть сообщение
manking, string - это тоже STL.
Так что советую почитать про векторы. Благо использовать их не тяжело. Зато удобно.
А эти векторы производительность не сильно уменьшат?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
04.10.2010, 20:13     не очень понял про динамическое выделение памяти. #4
manking, Достаточно. Но использовать
std::string* - не самое рациональное решение ИМХО. Тогда уж массив char** или char*[]
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
04.10.2010, 20:16     не очень понял про динамическое выделение памяти. #5
manking,
Вы на глазок и не почувствуете
Хотя это смотря в какой программе)))
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
04.10.2010, 20:35     не очень понял про динамическое выделение памяти. #6
silent_1991, Ну если массив из 1000 элементов и вектор из 1000 элементов... Наверное будет заметна разница.

Добавлено через 6 минут
Вектор заполняется от одинакового времени до 0.002 в сравнении с массивом

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <ctime>
#include <vector>
 
int main()
{
    int size=1000;
    clock_t start=clock();
    int*Arr;
    Arr=new int[size];
    for(int i=0; i<size; ++i)
        Arr[i]=i+1;
    std::cout<<static_cast<double>(clock()-start)/CLOCKS_PER_SEC<<'\n';
    start=clock();
    std::vector<int> Vec;
    for(int i=0; i<size; ++i)
        Vec.push_back(i+1);
    std::cout<<static_cast<double>(clock()-start)/CLOCKS_PER_SEC<<'\n';
        delete[] Arr;
    return 0;
}
В этом случае разница заметна. Массив - 0.012, вектор - 0.694
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <ctime>
#include <vector>
 
int main()
{
    int size=1000000;
    clock_t start=clock();
    int*Arr;
    Arr=new int[size];
    for(int i=0; i<size; ++i)
        Arr[i]=i+1;
    std::cout<<static_cast<double>(clock()-start)/CLOCKS_PER_SEC<<'\n';
    start=clock();
    std::vector<int> Vec;
    for(int i=0; i<size; ++i)
        Vec.push_back(i+1);
    std::cout<<static_cast<double>(clock()-start)/CLOCKS_PER_SEC<<'\n';
        delete[] Arr;
    return 0;
}
В этом случае - все еще жестче. 0.146 у массива и 6 с лихом секунд у вектора

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <ctime>
#include <vector>
 
int main()
{
    int size=10000000;
    clock_t start=clock();
    int*Arr;
    Arr=new int[size];
    for(int i=0; i<size; ++i)
        Arr[i]=i+1;
    std::cout<<static_cast<double>(clock()-start)/CLOCKS_PER_SEC<<'\n';
    start=clock();
    std::vector<int> Vec;
    for(int i=0; i<size; ++i)
        Vec.push_back(i+1);
    std::cout<<static_cast<double>(clock()-start)/CLOCKS_PER_SEC<<'\n';
    delete[] Arr;
    return 0;
}
Добавлено через 11 минут
Секунда с чем-то у массива. И около 80 у вектора.
Вообщем заметно даже очень.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <ctime>
#include <vector>
 
int main()
{
    int size=100000000;
    clock_t start=clock();
    int*Arr;
    Arr=new int[size];
    for(int i=0; i<size; ++i)
        Arr[i]=i+1;
    std::cout<<static_cast<double>(clock()-start)/CLOCKS_PER_SEC<<'\n';
    start=clock();
    std::vector<int> Vec;
    for(int i=0; i<size; ++i)
        Vec.push_back(i+1);
    std::cout<<static_cast<double>(clock()-start)/CLOCKS_PER_SEC<<'\n';
    delete[] Arr;
    return 0;
}
manking
1 / 1 / 0
Регистрация: 28.09.2010
Сообщений: 100
04.10.2010, 21:05  [ТС]     не очень понял про динамическое выделение памяти. #7
Да выглядит подторможено.

Я функцию использую которая смотрит сколько файлов в каталоге.
И все имена файлов попадают в массив.

Но в папке может быть и не 10 файлов а 50000.

и если массив объявить 500 000 элементов то программа выполняется больше чем за 2 секунды.
А если объявить меньше чем в папке оказывется, то выходит ошибка.

Вот я и искал, как в процессе выполнения увеличить ёмкость массива если понадобиться.

Спасибо!
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
04.10.2010, 21:14     не очень понял про динамическое выделение памяти. #8
А посчитать файлы в папке (счетчик в программке), а затем уже выделять память под дин. массив?
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2294 / 1664 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
04.10.2010, 21:25     не очень понял про динамическое выделение памяти. #9
Lavroff, если тебе заранее известно количество элементов, которые должен будет хранить вектор, то почему ты не используешь перегруженную версию конструктора, принимающую количество элементов?
Попробуй:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
#include <vector>
#include <ctime>
#include <cstddef>
 
int main() {
  const std::size_t size = 100000;
  
  std::clock_t start = std::clock();
   
  int* arr = new int[size]; 
  for(std::size_t i = 0; i < size; ++i)
    arr[i] = i;
   
  std::cout << static_cast<double>(std::clock() - start) / CLOCKS_PER_SEC << std::endl;
       
  start = std::clock();
 
  std::vector<int> vec(size);
  for(std::size_t i = 0; i < size; ++i)
    vec[i] = i;
           
  std::cout << static_cast<double>(std::clock() - start) / CLOCKS_PER_SEC << std::endl;
  
  return 0;
}
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
04.10.2010, 21:41     не очень понял про динамическое выделение памяти. #10
CyBOSSeR, То есть в основном из-за push_back?

Добавлено через 2 минуты
1 у массива, против 14 у вектора. Менее ощутимо. Но все же.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
#include <vector>
#include <ctime>
#include <cstddef>
 
int main() {
  const std::size_t size = 100000000;
  
  std::clock_t start = std::clock();
   
  int* arr = new int[size]; 
  for(std::size_t i = 0; i < size; ++i)
    arr[i] = i;
   
  std::cout << static_cast<double>(std::clock() - start) / CLOCKS_PER_SEC << std::endl;
       
  start = std::clock();
 
  std::vector<int> vec(size);
  for(std::size_t i = 0; i < size; ++i)
    vec[i] = i;
           
  std::cout << static_cast<double>(std::clock() - start) / CLOCKS_PER_SEC << std::endl;
  
  return 0;
}
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2294 / 1664 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
04.10.2010, 21:42     не очень понял про динамическое выделение памяти. #11
Lavroff, вектор по определенному закону перераспределяет память под свои элементы. Пройдись отладчиком по коду push_back'а - все станет понятно.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
04.10.2010, 21:43     не очень понял про динамическое выделение памяти. #12
CyBOSSeR, Ну да. Уже понял. Спасибо
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2294 / 1664 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
04.10.2010, 21:48     не очень понял про динамическое выделение памяти. #13
Lavroff, я чутка попутал, не надо ничего передавать в конструктор. Нужно вызвать resize.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream>
#include <vector>
#include <ctime>
#include <cstddef>
 
int main() {
  const std::size_t size = 1000000;
  
  std::clock_t start = std::clock();
   
  int* arr = new int[size]; 
  for (std::size_t i = 0; i < size; ++i)
    arr[i] = i;
   
  std::cout << static_cast<double>(std::clock() - start) / CLOCKS_PER_SEC << std::endl;
       
  start = std::clock();
 
  std::vector<int> vec;
  vec.resize(size);
  for (std::size_t i = 0; i < size; ++i)
    vec[i] = i;
           
  std::cout << static_cast<double>(std::clock() - start) / CLOCKS_PER_SEC << std::endl;
  
  return 0;
}
Проверь.

В принципе, можно заменить:
C++
1
vec.resize(size);
на
C++
1
vec.reserve(size);
и
C++
1
vec[i] = i;
на
C++
1
vec.push_back(i);
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
04.10.2010, 21:53     не очень понял про динамическое выделение памяти. #14
1 к 12

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream>
#include <vector>
#include <ctime>
#include <cstddef>
 
int main() {
  const std::size_t size = 100000000;
  
  std::clock_t start = std::clock();
   
  int* arr = new int[size]; 
  for (std::size_t i = 0; i < size; ++i)
    arr[i] = i;
   
  std::cout << static_cast<double>(std::clock() - start) / CLOCKS_PER_SEC << std::endl;
       
  start = std::clock();
 
  std::vector<int> vec;
  vec.resize(size);
  for (std::size_t i = 0; i < size; ++i)
    vec[i] = i;
           
  std::cout << static_cast<double>(std::clock() - start) / CLOCKS_PER_SEC << std::endl;
  
  return 0;
}
rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
04.10.2010, 21:55     не очень понял про динамическое выделение памяти. #15
Цитата Сообщение от Lavroff Посмотреть сообщение
1 у массива, против 14 у вектора. Менее ощутимо. Но все же
14 чего? Секунд? Это при выделенной заранее памяти?

Добавлено через 1 минуту
Не VS используешь случайно?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
04.10.2010, 22:00     не очень понял про динамическое выделение памяти. #16
rangerx, Его. Да и комп довольно слабый.
Andrew_Lvov
Эксперт C++
 Аватар для Andrew_Lvov
259 / 189 / 5
Регистрация: 19.08.2010
Сообщений: 758
Записей в блоге: 1
04.10.2010, 22:00     не очень понял про динамическое выделение памяти. #17
Lavroff, ты release version пробовал ? Не может быть аж такой разницы.
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2294 / 1664 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
04.10.2010, 22:04     не очень понял про динамическое выделение памяти. #18
Lavroff, а теперь самое смешное, поменяй код с вектором и массивом местами.

Не по теме:

Эх, не хотел я MSVS открывать.

ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
04.10.2010, 22:10     не очень понял про динамическое выделение памяти. #19
CyBOSSeR, Поменял) Вместе со временем. 11 у вектора против 1 у массива. Ща релиз попробую.
Оп. Релиз все поставил на места. 0.9 против 0.4
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.10.2010, 22:30     не очень понял про динамическое выделение памяти.
Еще ссылки по теме:

C++ Динамическое выделение памяти
Динамическое выделение памяти C++
C++ Динамическое выделение памяти

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Andrew_Lvov
Эксперт C++
 Аватар для Andrew_Lvov
259 / 189 / 5
Регистрация: 19.08.2010
Сообщений: 758
Записей в блоге: 1
04.10.2010, 22:30     не очень понял про динамическое выделение памяти. #20
Цитата Сообщение от Lavroff Посмотреть сообщение
Оп. Релиз все поставил на места. 0.9 против 0.4
Увы и ах, учитывая, что вектор при создании вызывает конструкторы своих элементов, разница более чем логична.
Yandex
Объявления
04.10.2010, 22:30     не очень понял про динамическое выделение памяти.
Ответ Создать тему
Опции темы

Текущее время: 05:35. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru