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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 26, средняя оценка - 4.77
Lindemann66
4 / 4 / 0
Регистрация: 28.04.2010
Сообщений: 162
#1

Отличие операции с выделением памяти и без - C++

09.08.2011, 16:05. Просмотров 3268. Ответов 60
Метки нет (Все метки)

Всем привет!

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

Вот нужно, допустим, создать массив из n элементов

Сделать это можно 2-мя способами


C++
1
int arr[n];

и
C++
1
int *arr = new int[n];
Но в одном случае создание массива сопровождается выделением памяти, а в другом - без
В чём принципиальная разница?
Я понимаю, в Qt сразу написано - объекты QObject необходимо создавать с выделением памяти, чтобы не было проблем
Понятно, так и делаем. А тут как правильней?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.08.2011, 16:05
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Отличие операции с выделением памяти и без (C++):

ошибка с выделением памяти - C++
выдает ошибку в выделении памяти. никто не подскажет почему? если что -задача звучит так примерно вводим веественные числа пока не...

Конструктор с выделением памяти - C++
Среди всех данных есть указатель, память для которого выделяется в конструкторе, необходимый размер передается в параметрах конструктора....

Проблема с выделением памяти - C++
Всем привет! Нужна помощь. Создаю класс и при компиляции возникает ошибка. Не пойму причину. Помогите пожалуйста. Конструктор должен...

Проблемы с выделением памяти - C++
Здравствуйте. Есть контейнер QList <Node *> В Node свой QList <Node *>. Строю программное дерево разбора выражение. На небольших...

Работа со строками и выделением памяти - C++
Задание написать класс строк (что-то типа String). #define MAX 100 class ascii { private: char* str; int len; ...

Задача на строки с выделением памяти - C++
Добрый вечер, помогите с задачкой Выводит на экран только строки, состоящие из заданного количества слов. Возвращает количество прочих...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1286 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
10.08.2011, 06:06 #46
Цитата Сообщение от Teravisor Посмотреть сообщение
Что будет работать лучше(или одинаково)
Всё, что известно статически, потенциально приводит к более быстрому коду, т.к. компилятор может лучше оптимизировать. Но это именно потенциально. Как будет на практике покажет только практика.
В твоём случае выделение "дофига даты" нужно делать в конструкторе или методом класса, точно так же, как и последующее освобождение памяти.
Опять же, твой пример не компилируемый, т.к. к а нет доступа из вне класса.
ValeryLaptev
Эксперт С++
1040 / 819 / 48
Регистрация: 30.04.2011
Сообщений: 1,659
10.08.2011, 08:32 #47
Цитата Сообщение от Teravisor Посмотреть сообщение
Извините, перебью вас с темы о том как массивы располагаются в памяти.
У меня возник вопрос по изначальной теме, который меня уже некоторое время беспокоит:
Что будет работать лучше(или одинаково):
Код
class a
{
    int data[дофига];
};
...
a* b=new a;
Код
class a
{
   int* data;
};
...
a* b=new a;
b->data=new int[дофига];
где дофига исчисляется результирующими килобайтами/мегабайтами.
Я уже писал выше: если дофига - это мегабайты, то нужен динамический массив. Ибо обычный будет занимать место в стеке, размер кооторого по умолчанию = 1 мегабайт
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1286 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
10.08.2011, 08:49 #48
"Ибо обычный будет занимать место в стеке"
В данном примере это не так, т.к. объект а создаётся в куче.
А вообще, полностью согласен.
Teravisor
31 / 31 / 3
Регистрация: 07.08.2011
Сообщений: 89
10.08.2011, 12:11 #49
Цитата Сообщение от Deviaphan Посмотреть сообщение
Опять же, твой пример не компилируемый, т.к. к а нет доступа из вне класса.
Я как всегда забыл public:, компилятору уже надоело по этому поводу меня материть)

Всем спасибо за разъяснение.
Сыроежка
Заблокирован
10.08.2011, 18:48 #50
Цитата Сообщение от ValeryLaptev Посмотреть сообщение
Сыроежка, ссылки на пункты стандарта - в студию! Особенно там, где написано об ограничении количества размерностей...
C++
1
int ttt[2][2][2][2][2][2][2][2][2][2][2][2][2][2][2][2][2][2][2][2][2][2][2][2][2][2][2][2];
Количество размерностей = 20.
Компилятор в студии не возникает.
О массивах говорится в разделе 8.3.4. Он так и называется "8.3.4. Arrays". А в параграфе №3 этого раздела дается определение многомерного массива ( multidimensional array ).

Что касается того, что вы определили массив размерностью 20 и задаете мне вопрос про тограничение размеррностей, то этот ваш вопрос опять-таки связан с вашим незнанием ни стандарта С++, ни стандарта С.

Дело в том, что есть некоторые огораничения компиляции, которые компилятор должен гарантировать. То есть это означает, что компилятор должен гарантоировать не меньше того ограничения, которое указано, но при этом может прежоставить большие возможности. Например, компилятор должен гарантировать некоторое заднное число вложенных предложений 'if'. Для массивов я поспешил нразвать цифру 16. На самом деле, например, в стандарте С это гарантированное число размерностей массива еще меньше и равно 12.
ValeryLaptev
Эксперт С++
1040 / 819 / 48
Регистрация: 30.04.2011
Сообщений: 1,659
10.08.2011, 18:51 #51
Цитата Сообщение от Сыроежка Посмотреть сообщение
О массивах говорится в разделе 8.3.4. Он так и называется "8.3.4. Arrays". А в параграфе №3 этого раздела дается определение многомерного массива ( multidimensional array ).

Что касается того, что вы определили массив размерностью 20 и задаете мне вопрос про тограничение размеррностей, то этот ваш вопрос опять-таки связан с вашим незнанием ни стандарта С++, ни стандарта С.

Дело в том, что есть некоторые огораничения компиляции, которые компилятор должен гарантировать. То есть это означает, что компилятор должен гарантоировать не меньше того ограничения, которое указано, но при этом может прежоставить большие возможности. Например, компилятор должен гарантировать некоторое заднное число вложенных предложений 'if'. Для массивов я поспешил нразвать цифру 16. На самом деле, например, в стандарте С это гарантированное число размерностей массива еще меньше и равно 12.
Сыроежка, кончай менторский тон. Нет в Стандарте С++ ограничений на размерность массива.
LosAngeles
Заблокирован
10.08.2011, 19:16 #52
из черновика C++0x
8.3.4 Arrays [dcl.array]

1 In a declaration T D where D has the form

D1 [ constant-expressionopt] attribute-specifier-seqopt

and the type of the identifier in the declaration T D1 is “derived-declarator-type-list T”, then the type of the
identifier of D is an array type; if the type of the identifier of D contains the auto type-specifier, the program
is ill-formed. T is called the array element type; this type shall not be a reference type, the (possibly cv-
qualified) type void, a function type or an abstract class type. If the constant-expression (5.19) is present,
it shall be an integral constant expression and its value shall be greater than zero. The constant expression
specifies the bound of (number of elements in) the array. If the value of the constant expression is N, the array
has N elements numbered 0 to N-1, and the type of the identifier of D is “derived-declarator-type-list array of N
T”. An object of array type contains a contiguously allocated non-empty set of N subobjects of type T. Except
as noted below, if the constant expression is omitted, the type of the identifier of D is “derived-declarator-type-
list array of unknown bound of T”, an incomplete object type. The type “derived-declarator-type-list array of
N T” is a different type from the type “derived-declarator-type-list array of unknown bound of T”, see 3.9. Any
type of the form “cv-qualifier-seq array of N T” is adjusted to “array of N cv-qualifier-seq T”, and similarly for
“array of unknown bound of T”. The optional attribute-specifier-seq appertains to the array. [ Example:

typedef int A[5], AA[2][3];
typedef const A CA; // type is “array of 5 const int”
typedef const AA CAA; // type is “array of 2 array of 3 const int”

— end example] [ Note: An “array of N cv-qualifier-seq T” has cv-qualified type; see 3.9.3. — end note]

2 An array can be constructed from one of the fundamental types (except void), from a pointer, from a pointer
to member, from a class, from an enumeration type, or from another array.

3 When several “array of” specifications are adjacent, a multidimensional array is created; only the first of the
constant expressions that specify the bounds of the arrays may be omitted. In addition to declarations in
which an incomplete object type is allowed, an array bound may be omitted in some cases in the declaration
of a function parameter (8.3.5). An array bound may also be omitted when the declarator is followed by an
initializer (8.5). In this case the bound is calculated from the number of initial elements (say, N) supplied
(8.5.1), and the type of the identifier of D is “array of N T.” Furthermore, if there is a preceding declaration
of the entity in the same scope in which the bound was specified, an omitted array bound is taken to be the
same as in that earlier declaration, and similarly for the definition of a static data member of a class.
[Example:

float fa[17], *afp[17];

declares an array of float numbers and an array of pointers to float numbers. For another example,

static int x3d[3][5][7];

declares a static three-dimensional array of integers, with rank 3 ×5 ×7. In complete detail, x3d is an array
of three items; each item is an array of five arrays; each of the latter arrays is an array of seven integers.
Any of the expressions x3d, x3d[i], x3d[i][j], x3d[i][j][k] can reasonably appear in an expression.
Finally,
extern int x[10];
struct S {
static int y[10];
};

int x[]; // OK: bound is 10
int S::y[]; // OK: bound is 10

void f() {
extern int x[];
int i = sizeof(x); // error: incomplete object type
}

— end example]

5 [Note: conversions affecting expressions of array type are described in 4.2. Objects of array types cannot
be modified, see 3.10. — end note]

6 [Note: Except where it has been declared for a class (13.5.5), the subscript operator []is interpreted in such
a way that E1[E2] is identical to *((E1)+(E2)). Because of the conversion rules that apply to +, if E1 is an
array and E2 an integer, then E1[E2] refers to the E2-th member of E1. Therefore, despite its asymmetric
appearance, subscripting is a commutative operation.

7 A consistent rule is followed for multidimensional arrays. If E is an n-dimensional array of rank i ×j ×. . . ×k,
then E appearing in an expression that is subject to the array-to-pointer conversion (4.2) is converted to a
pointer to an (n − 1)-dimensional array with rank j ×. . . ×k. If the * operator, either explicitly or implicitly
as a result of subscripting, is applied to this pointer, the result is the pointed-to (n − 1)-dimensional array,
which itself is immediately converted into a pointer.
[Example: consider

int x[3][5];

Here x is a 3 × 5 array of integers. When x appears in an expression, it is converted to a pointer to (the
first of three) five-membered arrays of integers. In the expression x[i] which is equivalent to *(x+i), x is
first converted to a pointer as described; then x+i is converted to the type of x, which involves multiplying
i by the length of the object to which the pointer points, namely five integer objects. The results are added
and indirection applied to yield an array (of five integers), which in turn is converted to a pointer to the
first of the integers. If there is another subscript the same argument applies again; this time the result is an
integer. — end example] — end note]

9 [Note: It follows from all this that arrays in C++ are stored row-wise (last subscript varies fastest) and that
the first subscript in the declaration helps determine the amount of storage consumed by an array but plays
no other part in subscript calculations. — end note]
Сыроежка
Заблокирован
10.08.2011, 19:28 #53
Цитата Сообщение от ValeryLaptev Посмотреть сообщение
Сыроежка, кончай менторский тон. Нет в Стандарте С++ ограничений на размерность массива.
Это есть в стандарте С, а стандарт С89 - это нормативныйф документ для С++. То есть если в станндарте С++ что-то не оговаривается, то действуют нормы стандарта С.

Эти ограничения гарантируют вам переносимость кода. То есть компилятор должен поддерживать по крайней мере то значение ограничения, которое указано в стандарте. В С этот раздел называется "Translation limits".
ValeryLaptev
Эксперт С++
1040 / 819 / 48
Регистрация: 30.04.2011
Сообщений: 1,659
10.08.2011, 19:32 #54
Цитата Сообщение от Сыроежка Посмотреть сообщение
Это есть в стандарте С, а стандарт С89 - это нормативныйф документ для С++. То есть если в станндарте С++ что-то не оговаривается, то действуют нормы стандарта С.

Эти ограничения гарантируют вам переносимость кода. То есть компилятор должен поддерживать по крайней мере то значение ограничения, которое указано в стандарте. В С этот раздел называется "Translation limits".
Ссылку на пункт стандарта С++ где декларируется: если в стандарте С++ что-то не оговаривается, то действуют нормы стандарта С.
Вы много голословных утверждений постите, выдавая их за истину в последней инстанции.

Добавлено через 54 секунды
Цитата Сообщение от LosAngeles Посмотреть сообщение
[SPOILER="из черновика C++0x"]
Практически все это есть в стандарте 2003 года.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1286 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
10.08.2011, 19:37 #55
из черновика C++0x
Не увидел ни слова о количестве измерений.
В принципе, разговори ни о чём. Лучше приведите хоть один пример, где 10 измерений нужны.) Жутко интересно.
Сыроежка
Заблокирован
10.08.2011, 19:45 #56
Цитата Сообщение от ValeryLaptev Посмотреть сообщение
Ссылку на пункт стандарта С++ где декларируется: если в стандарте С++ что-то не оговаривается, то действуют нормы стандарта С.
Вы много голословных утверждений постите, выдавая их за истину в последней инстанции.

Добавлено через 54 секунды

Практически все это есть в стандарте 2003 года.
В самом начале стандарта С++ говорится, что С++ базируется на С и стандарт С89 является нормативным документом для стандарта С++. Я думаю, что сложность представляет для вас понятие "нормативный документ"? Кроме стандарта С89 нормативными документами для С++ служат и другие документы, как, например, стандарт Unicode и другие.

Но даже если не понимать, что такое нормативный документ, очевидно, что без таких установленных ограничений, код С++ был бы вообще не переносим!
ValeryLaptev
Эксперт С++
1040 / 819 / 48
Регистрация: 30.04.2011
Сообщений: 1,659
10.08.2011, 20:28 #57
Сыроежка, в "самом начале" - это сильно неконкретно. Хочешь, чтобы тебя воспринимали нормально, так и напиши: Пункт 1.2 Normative reference гласит...
Тем не менее, этот пункт означает, что язык С, как он описан в документе ISO/IEC 9899:1999, Programming languages – C, должен в полной мере поддерживаться компилятором С++.

Далее. Ваше сообщение:
Вот так по индукции, вы можете добраться до массива n-размерности., которая, если память не изменяет, обычно ограничена в Стандарте числом 16.
Затем вы поправились до 12. Дык это ограничение СНИЗУ, а не сверху. Прежде, чем обвинять других в незнании стандарта, потрудитесь точно выражать свои мысли.

Далее, смотрим пункт 8.3.4 стандарта, пункт 4.
For another example,
static int x3d[3][5][7];
declares a static three-dimensional array of integers, with rank 3×5×7. In complete detail, x3d is an array
of three items; each item is an array of five arrays; each of the latter arrays is an array of seven integers.
Переводим: Другой пример... объявляет трехмерный статический массив целых размером ... Более детально, x3d является массивом из трех элементов; каждый элемент есть массив из пяти массивов; каждый из последних массивов является массивом из семи целых...
Где мое незнание стандарта? Я утверждал ровно то же самое: массив массивов массивов...
Сыроежка
Заблокирован
10.08.2011, 20:48 #58
Цитата Сообщение от ValeryLaptev Посмотреть сообщение
Сыроежка, в "самом начале" - это сильно неконкретно. Хочешь, чтобы тебя воспринимали нормально, так и напиши: Пункт 1.2 Normative reference гласит...
Тем не менее, этот пункт означает, что язык С, как он описан в документе ISO/IEC 9899:1999, Programming languages – C, должен в полной мере поддерживаться компилятором С++.

Далее. Ваше сообщение:
Затем вы поправились до 12. Дык это ограничение СНИЗУ, а не сверху. Прежде, чем обвинять других в незнании стандарта, потрудитесь точно выражать свои мысли.

Далее, смотрим пункт 8.3.4 стандарта, пункт 4.

Переводим: Другой пример... объявляет трехмерный статический массив целых размером ... Более детально, x3d является массивом из трех элементов; каждый элемент есть массив из пяти массивов; каждый из последних массивов является массивом из семи целых...
Где мое незнание стандарта? Я утверждал ровно то же самое: массив массивов массивов...
Это хорошо, что вы под моим руководством не поленились сами почитать стандарт. Читать внимательно самостоятельно стандарт - это полезно. Увы, у меня сейчас под рукой нет стандарта.
Что касается ограничений, то я с самого начала вам говорил, что это ограничения того, что компилятор должен гарантировать. Что каждый отдельный компилятор может предоставитьь и большие возможности, но указанные лимиты должны быть гарантированы. Вы просто не совсем внимательно читали мои сообщения, а, точнее говоря, в пылу полемики, просто не обращали должного внимания на то, что я писал.

Что касается вашего последнего абзаца, то так в математике объясняют многомерные массивы. Иначе очень трудно объяснитьб трехмерный массив, который в пространстве представляет собой трехмеррное изображение куба. Но это ничего общего с вашим начальным представлением того, что, якобы, в С++ нет многомерных массивов, не имеет. Это просто обычно так в школах школьникам объясняют, что такое многомерный массив.

Я поэтому всех призываю внимательно читать стандрат, а не заменять стандарт своими фантазияим о языке.
ValeryLaptev
Эксперт С++
1040 / 819 / 48
Регистрация: 30.04.2011
Сообщений: 1,659
10.08.2011, 21:06 #59
Сыроежка, я привел точные цитаты. ВАШИ слова. И не надо теперь передергивать и писать, что вы подразумевали. Потрудитесь точно выражать свои мысли - вы же программист.
Это раз.
Два: аппелировать к Стандарту, не имея его под рукой - это непрофессионально.
У вас на компьютере нет Стандарта?
Три: Стандарт я читаю тогда, когда мне требуется. Руководители мне при этом не нужны.
Сыроежка
Заблокирован
10.08.2011, 23:31 #60
Цитата Сообщение от ValeryLaptev Посмотреть сообщение
Сыроежка, я привел точные цитаты. ВАШИ слова. И не надо теперь передергивать и писать, что вы подразумевали. Потрудитесь точно выражать свои мысли - вы же программист.
Это раз.
Два: аппелировать к Стандарту, не имея его под рукой - это непрофессионально.
У вас на компьютере нет Стандарта?
Три: Стандарт я читаю тогда, когда мне требуется. Руководители мне при этом не нужны.
Спасибо, посмеялся. Вы сами-то поняли, что вы написали. Аппеллировать к стандарту можно и нужно всегда независимо от того, есть ли он у вас под рукой или нет. Тем более, что я даже вам указал точную главу, где содержится описание массивов. Я просто всегда исхожу из того, что мой оппонент по крайней мере раз читал стандарт, и если у него какие-то сомнения, то он может самостоятельно туда заглянуть. Что касается меня, то я чаще всего общаюсь в интернет из тех мест, как, например, интернет-кафе, где у меня под рукой ничего нет.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.08.2011, 23:31
Привет! Вот еще темы с ответами:

Строки с выделением динамической памяти - C++
Привет всем! Помогите решить вот такую задачу: Ввести две строки. Определить совпадение их слов (Первое слово 1 строки сравнить с первым...

Динамическое выделением памяти для массивов - C++
Даны три массива вещественных чисел X(25), B(30), Y(25). Из исходных массивов сформировать массив К, элементы которого равны количеству...

Обращение к структуре в классе с выделением памяти - C++
Добрый день уважаемые форумчане. Столкнулся с такой проблемой. Есть класс: class Components { struct comps{ // -- База компонентов ...

Двумерный массив с динамическим выделением памяти - C++
Помогите пожалуйста вставить вот в эту вот задачу динамическое выделение памяти: #include <iostream> using namespace std; ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
10.08.2011, 23:31
Ответ Создать тему
Опции темы

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