|
4 / 4 / 5
Регистрация: 28.04.2010
Сообщений: 162
|
|||||||||||
Отличие операции с выделением памяти и без09.08.2011, 16:05. Показов 6116. Ответов 60
Метки нет (Все метки)
Всем привет!
Не сочтите за глупость, но возник интересный вопрос, над которым давно думаю, а овтета нигде не находил Вот нужно, допустим, создать массив из n элементов Сделать это можно 2-мя способами
и
В чём принципиальная разница? Я понимаю, в Qt сразу написано - объекты QObject необходимо создавать с выделением памяти, чтобы не было проблем Понятно, так и делаем. А тут как правильней?
0
|
|||||||||||
| 09.08.2011, 16:05 | |
|
Ответы с готовыми решениями:
60
Ошибка с выделением памяти Конструктор с выделением памяти |
|
Делаю внезапно и красиво
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
|
||
| 09.08.2011, 20:00 | ||
|
Весьма интересная конструкция. Мне даже в голову такое не приходило.
0
|
||
|
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
|
||
| 09.08.2011, 20:05 | ||
|
0
|
||
|
1069 / 848 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
|
||
| 09.08.2011, 20:28 | ||
|
Вот что написали на РСДН.
0
|
||
|
32 / 32 / 2
Регистрация: 07.08.2011
Сообщений: 89
|
|||||||||||
| 10.08.2011, 00:13 | |||||||||||
|
Извините, перебью вас с темы о том как массивы располагаются в памяти.
У меня возник вопрос по изначальной теме, который меня уже некоторое время беспокоит: Что будет работать лучше(или одинаково):
1
|
|||||||||||
|
Заблокирован
|
|
| 10.08.2011, 05:41 | |
|
дофига лучше размещать в куче, для игр часто выделяют большой кусок, инкапсулируют размещающий new и delete в класс и называют всё это менеджером памяти
1
|
|
|
Делаю внезапно и красиво
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
|
||
| 10.08.2011, 06:06 | ||
|
В твоём случае выделение "дофига даты" нужно делать в конструкторе или методом класса, точно так же, как и последующее освобождение памяти. Опять же, твой пример не компилируемый, т.к. к а нет доступа из вне класса.
1
|
||
|
1069 / 848 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
|
||
| 10.08.2011, 08:32 | ||
|
0
|
||
|
Делаю внезапно и красиво
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
|
|
| 10.08.2011, 08:49 | |
|
"Ибо обычный будет занимать место в стеке"
В данном примере это не так, т.к. объект а создаётся в куче. А вообще, полностью согласен.
0
|
|
|
32 / 32 / 2
Регистрация: 07.08.2011
Сообщений: 89
|
||
| 10.08.2011, 12:11 | ||
|
Всем спасибо за разъяснение.
0
|
||
|
Заблокирован
|
||
| 10.08.2011, 18:48 | ||
|
Что касается того, что вы определили массив размерностью 20 и задаете мне вопрос про тограничение размеррностей, то этот ваш вопрос опять-таки связан с вашим незнанием ни стандарта С++, ни стандарта С. Дело в том, что есть некоторые огораничения компиляции, которые компилятор должен гарантировать. То есть это означает, что компилятор должен гарантоировать не меньше того ограничения, которое указано, но при этом может прежоставить большие возможности. Например, компилятор должен гарантировать некоторое заднное число вложенных предложений 'if'. Для массивов я поспешил нразвать цифру 16. На самом деле, например, в стандарте С это гарантированное число размерностей массива еще меньше и равно 12.
0
|
||
|
1069 / 848 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
|
||
| 10.08.2011, 18:51 | ||
|
0
|
||
|
Заблокирован
|
|
| 10.08.2011, 19:16 | |
|
из черновика 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]
0
|
|
|
Заблокирован
|
||
| 10.08.2011, 19:28 | ||
|
Эти ограничения гарантируют вам переносимость кода. То есть компилятор должен поддерживать по крайней мере то значение ограничения, которое указано в стандарте. В С этот раздел называется "Translation limits".
0
|
||
|
1069 / 848 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
|
|||
| 10.08.2011, 19:32 | |||
|
Вы много голословных утверждений постите, выдавая их за истину в последней инстанции. Добавлено через 54 секунды
0
|
|||
|
Делаю внезапно и красиво
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
|
||
| 10.08.2011, 19:37 | ||
В принципе, разговори ни о чём. Лучше приведите хоть один пример, где 10 измерений нужны.) Жутко интересно.
0
|
||
|
Заблокирован
|
||
| 10.08.2011, 19:45 | ||
|
Но даже если не понимать, что такое нормативный документ, очевидно, что без таких установленных ограничений, код С++ был бы вообще не переносим!
0
|
||
|
1069 / 848 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
|
|||
| 10.08.2011, 20:28 | |||
|
Сыроежка, в "самом начале" - это сильно неконкретно. Хочешь, чтобы тебя воспринимали нормально, так и напиши: Пункт 1.2 Normative reference гласит...
Тем не менее, этот пункт означает, что язык С, как он описан в документе ISO/IEC 9899:1999, Programming languages – C, должен в полной мере поддерживаться компилятором С++. Далее. Ваше сообщение:
Далее, смотрим пункт 8.3.4 стандарта, пункт 4.
Где мое незнание стандарта? Я утверждал ровно то же самое: массив массивов массивов...
0
|
|||
|
Заблокирован
|
||
| 10.08.2011, 20:48 | ||
|
Что касается ограничений, то я с самого начала вам говорил, что это ограничения того, что компилятор должен гарантировать. Что каждый отдельный компилятор может предоставитьь и большие возможности, но указанные лимиты должны быть гарантированы. Вы просто не совсем внимательно читали мои сообщения, а, точнее говоря, в пылу полемики, просто не обращали должного внимания на то, что я писал. Что касается вашего последнего абзаца, то так в математике объясняют многомерные массивы. Иначе очень трудно объяснитьб трехмерный массив, который в пространстве представляет собой трехмеррное изображение куба. Но это ничего общего с вашим начальным представлением того, что, якобы, в С++ нет многомерных массивов, не имеет. Это просто обычно так в школах школьникам объясняют, что такое многомерный массив. Я поэтому всех призываю внимательно читать стандрат, а не заменять стандарт своими фантазияим о языке.
0
|
||
|
1069 / 848 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
|
|
| 10.08.2011, 21:06 | |
|
Сыроежка, я привел точные цитаты. ВАШИ слова. И не надо теперь передергивать и писать, что вы подразумевали. Потрудитесь точно выражать свои мысли - вы же программист.
Это раз. Два: аппелировать к Стандарту, не имея его под рукой - это непрофессионально. У вас на компьютере нет Стандарта? Три: Стандарт я читаю тогда, когда мне требуется. Руководители мне при этом не нужны.
0
|
|
|
Заблокирован
|
||
| 10.08.2011, 23:31 | ||
|
0
|
||
| 10.08.2011, 23:31 | |
|
Помогаю со студенческими работами здесь
60
Проблема с выделением памяти Проблема с выделением памяти Ошибка с выделением памяти Проблемы с выделением памяти Ошибка в коде с выделением памяти Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога
Финальные проекты на Си и на C++:
finish-rectangles-sdl3-c. zip
finish-rectangles-sdl3-cpp. zip
|
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие.
Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
|
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ВВЕДЕНИЕ
Выполняя задание на управление насосной группой заполнения резервуара,. . .
|
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
|
|
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога
Финальные проекты на Си и на C++:
hello-sdl3-c. zip
hello-sdl3-cpp. zip
Результат:
|
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога
MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
|
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд.
Даже если у вас. . .
|
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает
монорепозиторий в котором находятся все исходники.
При создании нового решения, мы просто добавляем нужные проекты
и имеем. . .
|