Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
dobriy
6 / 6 / 0
Регистрация: 05.07.2012
Сообщений: 30
#1

Выделение памяти - C++

20.04.2013, 01:35. Просмотров 464. Ответов 7
Метки нет (Все метки)

Всем доброго времени суток!
Пытаюсь сделать связанный список на 100кк элементов, но не выделив памяти и под половину, программа жрёт 4 гига оперативы, и как вы поняли намерена сожрать больше. Компилятор настроен на платформу х64 и по моим подсчётам это всё дело должно занять в памяти 1.6 гига, подскажите пожалуйста что я делаю не так?

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
// ConsoleApplication62.cpp : Defines the entry point for the console application.
//
 
#include "stdafx.h"
#include "stdlib.h"
#include "iostream"
#include <ctime>
 
struct Item
{
public: 
    int theProperty; 
    Item* tail;
};
 
void _tmain()
{
    Item* i = nullptr;
    std::cout << sizeof(Item) << "\n";
    Item* list = (Item*)malloc(sizeof(Item));
    list->theProperty = -1;
    list->tail = NULL;
    unsigned start = clock();
    for (int i = 0; i < 100000000; i++)
    {
        Item* temp = (Item*)malloc(sizeof(Item));
        temp->theProperty = rand();
        temp->tail = list;
        list = temp;
    }
 
    std::cout << clock()-start << "\n";
    Item* p = list;
    float result = 0;
    start = clock();
 
    while (p->tail != NULL)
    {
        result += p->theProperty;
        p = p->tail;
    }
 
    std::cout << clock()-start << "\n";
    p = list;
    start = clock();
    while (p->tail != NULL)
    {
        Item* temp = p->tail;
        free(p);
        p = temp;
    }
    std::cout << clock()-start << "\n";
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.04.2013, 01:35
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Выделение памяти (C++):

Распределение памяти. Динамическое выделение памяти - C++
an-1 an-2 ... a2

Выделение памяти, проверка на утечку памяти - C++
Интересуют два вопроса: 1. Правильно ли устроен алгоритм выделения, удаление и запись ячейки памяти? Может быть, есть более простые...

Выделение памяти (new) - C++
Наткнулся на пример где делают непонятные мне выделения памяти с помощью new X* pi = new X; X* p2 = new X ; X* рЗ = new (&amp;buffer )...

выделение памяти - C++
Здравствуйте, помогите пожалуйста исправить ошибку, это лишь малая часть кода. В задании: поле name должно быть динамическим: char...

Выделение памяти - C++
Во время выполнения программы после ввода нескольких символов выводит ошибку: double free or corruption(out): 0x0000000001157010 ***...

Выделение памяти - C++
Вот кусок кода, класс и функция добавления в список Класс занимает 64 бита, я добавляю 10 элементов в список - 640 бит Потом отнимаю...

7
Croessmah
Ушел
Эксперт CЭксперт С++
13553 / 7704 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
20.04.2013, 06:42 #2
Цитата Сообщение от dobriy Посмотреть сообщение
программа жрёт 4 гига оперативы
Во-первых, с чего Вы это взяли?
А во-вторых, debug режим всегда кушает больше, так что запускайте р режиме Release и без отладчика.
0
dobriy
6 / 6 / 0
Регистрация: 05.07.2012
Сообщений: 30
20.04.2013, 13:07  [ТС] #3
взял с того что я следил за ней в task manager'е.
З.ы. в релизе откушала всего 3 гига, но отработала, спасибо!) но зреет другой вопрос, откуда 3 гига?
0
Croessmah
Ушел
Эксперт CЭксперт С++
13553 / 7704 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
20.04.2013, 13:12 #4
У меня 1.5 гб сожрала.
0
Игорь с++
437 / 460 / 16
Регистрация: 26.01.2011
Сообщений: 2,032
20.04.2013, 13:32 #5
и у меня 1.5 тоже сожрала
0
Croessmah
Ушел
Эксперт CЭксперт С++
13553 / 7704 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
20.04.2013, 13:57 #6
Хотя все правильно. Вы же на x64 архитектуру делаете, поэтому 3гб вышло
0
Toshkarik
1143 / 860 / 51
Регистрация: 03.08.2011
Сообщений: 2,390
Завершенные тесты: 1
20.04.2013, 14:11 #7
100000000 * ( sizeof( int ) + sizeof( void * ))
На 32 разрядной системе должно получится ~800mb, на 64 - ~1200mb.

Добавлено через 11 минут
Забыл про выравнивание про размеру слова, изза этого размер структуры равен 16 байтам, вместо 12. Поэтому получается ~1600mb на 64 разрядной.
0
stima
490 / 342 / 40
Регистрация: 22.03.2011
Сообщений: 1,095
Завершенные тесты: 2
20.04.2013, 14:33 #8
Не совсем так, Вы все забыли про мета информацию самого malloca. Почитайте про пул памяти.
0
20.04.2013, 14:33
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.04.2013, 14:33
Привет! Вот еще темы с ответами:

Не выделение памяти - C++
По какой причине не работает это программа ? #include&lt;iostream&gt; #include &lt;string&gt; using namespace std; int main () ...

выделение памяти - C++
#include &lt;iostream&gt; using namespace std; class Matrix { int m, n; public: float **M; Matrix(int a, int b); void...

Выделение памяти - C++
Часто возникает такая проблема, когда конфигурирую проект как Release происходит ошибка выделения памяти (при вызывании new), например...

Выделение памяти. - C++
Значит так.Задача такая. Ввести строки или строку символов. Сколько мы будем вводить символов неизвестно.Может быть 10 а может быть...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru