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

Отличия в работе new и malloc - C++

Восстановить пароль Регистрация
 
ArrOfChar
Сообщений: n/a
15.04.2013, 18:29     Отличия в работе new и malloc #1
Выполняла задание на определение максимального объема памяти, который может выделить программа под трехмерный массив. В первый раз программа была написана с использованием malloc/free, второй раз с использованием new/delete. Результаты очень отличались: в первом случае максимальный размер массива был 600, во втором около 12000, к тому же второй вариант работал раз в 5 быстрее.

Чем может быть вызвано такое различие? Информацию о реализации этих функций я не нашла, где можно это узнать?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.04.2013, 18:29     Отличия в работе new и malloc
Посмотрите здесь:

malloc в С++ C++
malloc() C++
C++ Ошибка с malloc
C++ malloc vs new
new на malloc C++
C++ new vs malloc
new, malloc, C++
C++ Malloc vs new

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nagdiel
 Аватар для Nagdiel
114 / 114 / 3
Регистрация: 23.12.2012
Сообщений: 195
15.04.2013, 22:16     Отличия в работе new и malloc #2
Код покажите для каждого случая и напишите, чем компилировали.
ArrOfChar
Сообщений: n/a
15.04.2013, 23:04     Отличия в работе new и malloc #3
Обе программы компилировала в GCC.
Первый случай, calloc, три файла:
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
//Файл array.h
#ifndef ARRAY_H
#define ARRAY_H
 
class ARRAY
{
  public:
    ARRAY(int n);
    int GetN();
    ~ARRAY();
 
  private:
    int N;
    int ***a;
};
 
#endif
 
 
//Файл array.cpp
#include "array.h"
#include <iostream>
#include <cstdlib>
 
using namespace std;
 
    ARRAY::ARRAY(int n):N(n)
    {
        //cout << "\n CONSTRUCT" << endl;
        a=(int ***)calloc(N,sizeof(int**));
        if (a!=NULL)
        {
            for (int i=0; i<N; i++)
            {
                a[i]=(int **)calloc(n,sizeof(int*));
                if (a[i]!=NULL)
                {
                    for (int j=0; j<N; j++)
                    {
                        a[i][j]=(int *)calloc(n,sizeof(int));
                        if (a[i][j]==NULL) throw n;
                    }
                }
                else throw n;
            }
        }
        else throw n;
    }
 
    ARRAY::~ARRAY()
    {
        //cout << "\n DETRUCT" << endl;
        for (int i=0; i<N; i++)
            for (int j=0; j<N; j++)
                free(a[i][j]);
        for (int i=0; i<N; i++)
            free(a[i]);
        free(a);
    };
 
 
//Файл main.cpp
#include <iostream>
#include "array.h"
#include "limits.h"
using namespace std;
 
int main()
{
    try
    {
        for (int n=1;n<INT_MAX;n++)
        {
            ARRAY a=ARRAY(n);
            //cout << ".";
        }
    }
    catch(int a)
    {
        cout << "\n Max: " << a-1 << endl;
    }
}
Второй случай, new:
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
//Хидер
#ifndef ARRAY_H
#define ARRAY_H
 
class ARRAY
{
  public:
    ARRAY(int n);
    int GetN();
    ~ARRAY();
 
  private:
    const int N;
    int ***a;
};
 
#endif
 
//описание класса
#include "array.h"
#include "anerror.h"
#include <iostream>
#include <cstdlib>
 
using namespace std;
 
ARRAY::ARRAY(int n):N(n)
{
  a=new int**[N];
  for (int i=0; i<N; i++)
  {
    a[i]=new int*[N];
    for (int j=0; j<N; j++)
      a[i][j]=new int[N];
  }
}
 
  ARRAY::~ARRAY()
  {
    for (int i=0; i<N; i++)
      for (int j=0; j<N; j++)
        delete[] a[i][j];
    for (int i=0; i<N; i++)
      delete[] a[i];
    delete[] a;
  };
 
//мейн
#include <iostream>
#include "array.h"
#include "limits.h"
#include "anerror.h"
 
using namespace std;
 
int main()
{
  try
  {
    for (int n=1;n<INT_MAX;n++)
    {
      ARRAY a(n);
      cout << n << " ";
    }
  }
  catch(bad_alloc)
  {
    cout << "\n The End. ";
  }
  return 0;
}
Только сейчас заметила, что использую calloc вместо вместо malloc, наверно всё дело в обнулении))

Добавлено через 26 минут
Благодарю за помощь, всё решилось)) Оба метода работают одинаково за одинаковое время, видимо, была ошибка где-то в выделении памяти.
Yandex
Объявления
15.04.2013, 23:04     Отличия в работе new и malloc
Ответ Создать тему
Опции темы

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