Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Двумерные массивы и С++
|
|||
|---|---|---|---|
|
#18+
BagaBagaDima TПоработает до чего-то подобного Код: plaintext 1. 2. Не беспокойтесь за переполнение стека раньше времени. Соглашусь, кто-то уже побеспокоился за меня. Проблему переполнения стэка наблюдал недавно в MSVC2015 с массивами фиксированного размера, затестил double arr[n]; так оно просто не компилируется, похоже MS просто еще не решил как реализовать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2016, 20:04 |
|
||
|
Двумерные массивы и С++
|
|||
|---|---|---|---|
|
#18+
BagaBagaSashaMercury1. Если мой код не имеет ничего общего с С++, то с таким-же успехом вы можете утверждать что С++ не имеет ничего общего с Си. 2. Достаточно очевидно, что с аналогичным успехом можно использовать и оператор new 3. Я очень не хочу спорить по очевидным моментам как для вас, так и для меня и для всех остальных, думаю все друг друга прекрасно поняли. Выделение памяти на стеке меня совершенно не интересует 1. Вы можете продолжать думать, что пишете на С++. И использовать malloc и new, printf и cout. Если так принято в вашей команде (если она есть). А приписывать мне чужой бред - не надо. 2. Современный С++ практически не использует оператор new. И это современный тренд развития С++. Если вам нужен контейнер с управлением памятью - используйте из библиотек (stl, boost, любая на ваш вкус, можете написать свою). Хоть vector, хоть dynarray эффективно прячут от программиста управление выделением памятью. Любое "ручное" выделение ресурса обязательно сопровождается стражем (освобождения) ресурса (RAII-идиома). 3. В чём __конкретно__ я не прав, и что же это за существо, по которому я не прав, вы так и не ответили. Выделение памяти на стеке или в куче - детали реализации. Если для решения задачи достаточно памяти стека, я возьму стек. Иначе - буду смотреть в кучу. Или специализированные аллокаторы. Если вы не можете предсказать режим и потребляемый объем памяти, то и с выделением в куче ... мало хорошего получите (что лучше - свалиться по стеку, или засвописть систему и свалиться уже тогда?) Вы всегда знаете, где именно будет выделена память тем или иным классом? Тем же string? А в случае small-string-optimization? ) Конкретно вы не правы в том: 1. Что утверждали что С++ не имеет никакого отношения к функции malloc. Выше вам привели ссылку на стандарта языка С++ и даже цитату опровергающее ваше суждение 2. Пусть у вас сохранится ваше личное мнение, на которое вы безусловно имеете все права, и пусть malloc - в принципе нелегальная функция в контексте С++. Я уже не раз вам подсказал, в том случае, если вы используете оператор new, аналогичный код сохранится, как и 4 строчки. И конечно, ваши придирки не по существу (и в принципе необоснованные, см. п. 1) не должны были иметь место. 3. Откуда у вас информация о том, как часто в языке С++ используется new ? Я недостаточно хорошо разбираюсь в специфике организации работы кучи и стека, потому не могу как-то обстоятельно прокомментировать ваш последний абзац. Но у меня не раз возникала ситуация, что выделение памяти на стеке приводило к краху программы. Приведите пожалуйста конкретный пример, как по вашему правильным было бы динамически выделить память на массив массивов или двумерный массив используя только С++ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2016, 02:50 |
|
||
|
Двумерные массивы и С++
|
|||
|---|---|---|---|
|
#18+
SashaMercuryИ конечно, ваши придирки не по существуnew/delete - части C++, имеющие специальную поддержку. Когда вызывается new(), то компилятор "понимает", что в деструкторе надо вызвать соответствующий delete(). Когда вызывается malloc(), то вы должны написать деструктор, в котором будет вызван free(). И это код, который надо не только написать, но и сопровождать. P.S. То, что "это" можно использовать, ещё не означает, что "это" нужно использовать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2016, 03:03 |
|
||
|
Двумерные массивы и С++
|
|||
|---|---|---|---|
|
#18+
Basil A. SidorovSashaMercuryИ конечно, ваши придирки не по существуnew/delete - части C++, имеющие специальную поддержку. Когда вызывается new(), то компилятор "понимает", что в деструкторе надо вызвать соответствующий delete(). Когда вызывается malloc(), то вы должны написать деструктор, в котором будет вызван free(). И это код, который надо не только написать, но и сопровождать. P.S. То, что "это" можно использовать, ещё не означает, что "это" нужно использовать. Возможно вы и правы, однако первоначальное утверждение было не том, нужно или не нужно (или насколько это хороший тон), а легально или нелегально в принципе относительно языка С++. А это кардинально разные понятия ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2016, 03:13 |
|
||
|
Двумерные массивы и С++
|
|||
|---|---|---|---|
|
#18+
Basil A. SidorovКогда вызывается new(), то компилятор "понимает", что в деструкторе надо вызвать соответствующий delete(). Когда вызывается malloc(), то вы должны написать деструктор, в котором будет вызван free(). И это код, который надо не только написать, но и сопровождать. А можно минимальный пример когда компилятор понимает что автоматически надо вызвать delete? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2016, 03:18 |
|
||
|
Двумерные массивы и С++
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyА можно минимальный пример когда компилятор понимает что автоматически надо вызвать delete?Нет, нельзя, т.к. я был грубо неправ насчёт автоматического вызова delete в деструкторах. Наоборот - delete автоматически вызовет деструкторы для объектов, которые разместил new. Но, я продолжаю настаивать, что использование malloc/free в языке, где для управления памятью предназначены new/delete - неправильно. Даже в тех случаях, когда использование malloc/free (иных системно-ориентированных аналогов) - необходимо, стОит подумать или о буферированном new или о переопределении стандартных new/delete. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2016, 03:38 |
|
||
|
Двумерные массивы и С++
|
|||
|---|---|---|---|
|
#18+
Basil A. SidorovAnatoly MoskovskyА можно минимальный пример когда компилятор понимает что автоматически надо вызвать delete?Нет, нельзя, т.к. я был грубо неправ насчёт автоматического вызова delete в деструкторах. Наоборот - delete автоматически вызовет деструкторы для объектов, которые разместил new. Но, я продолжаю настаивать, что использование malloc/free в языке, где для управления памятью предназначены new/delete - неправильно. Даже в тех случаях, когда использование malloc/free (иных системно-ориентированных аналогов) - необходимо, стОит подумать или о буферированном new или о переопределении стандартных new/delete. Послушайте, я вообще по этому поводу ничего не говорю. Да и что значит ваше 'неправильно'? Незаконно? Думаю вы имеете ввиду другое. Под 'неправильно' вы понимаете 'было бы лучше/следует/хороший тон'. Я в этом далеко не уверен, но про это речь выше и не шла. Выше было утверждение, согласно которому, malloc и С++ никаким образом не связаны, что в программах на языке С++ malloc использовать не то чтобы нежелательно или это есть плохой тон, а вообще нельзя. Вот и всё. Вообще пустой спор, что мы тут развели ни о чем - это настолько очевидные вещи. Как будто я вас пытаюсь убедить что malloc хорошо, а new плохо. Или что при вызове malloc тоже вызывается конструктор. Таких глупостей я вам не говорю. Да и вообще, я что, написал что мой код в самом первом посте является примером хорошего кода на С++? По-моему я написал что так я делаю, и как лучше сделать это грамотно с использованием всех возможных средств С++. Более того, я задал уточняющий вопрос: SSq2 Когда вы пишите программы на С++, используете ли вы функции выделения памяти malloc,calloc и др. ? Но дело не в этом даже, просто мне принципиально не нравится когда говорят вещи очевидно не соответствующие действительности. Тут не девочки из детского сада сидят чтобы слушать очевидные глупости, и общение ради пустого спора никому не интересно. Что дальше, будем доказывать, что С++ является надмножеством Си? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2016, 06:28 |
|
||
|
Двумерные массивы и С++
|
|||
|---|---|---|---|
|
#18+
Неопрятный код допустим в "стартовых скриптах". Просто потому, что такой скрипт работает в известном окружении и на многие "принятые здесь умолчания" можно спокойно заложиться. Даже если окружение (внезапно) изменилось, то в самом пиковом раскладе такой скрипт можно "перебить лапками" за пару-тройку минут через "цопи цон филе". С программами такой подход не работает просто потому, что компилируемую программу нельзя просто так взять и "поредактировать по месту". Мне, например, больше года пришлось воевать с разработчиками из-за того, что, грубо говоря, кому-то было лень написать два блока try/catch вместо одного - часть реальной системы гарантированно ложилась на пару-тройку дней при каждом обновлении. И это - java, где всё должно быть защищено и безопасно, но цена неряшливости - нервы и потерянное время сотен живых людей. P.S. А так, да - подумаешь написал в статической функции не то, что полагается, а то, что привык. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2016, 19:23 |
|
||
|
Двумерные массивы и С++
|
|||
|---|---|---|---|
|
#18+
Basil A. Sidorov, Узбагойся, тут тебе не Ява. Люди понимают отличие new от malloc ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2016, 21:49 |
|
||
|
Двумерные массивы и С++
|
|||
|---|---|---|---|
|
#18+
Эх, стоило пропустить пару дней, а тут такие открытия делаются... SashaMercury... просто мне принципиально не нравится когда говорят вещи очевидно не соответствующие действительности. Тут не девочки из детского сада сидят чтобы слушать очевидные глупости, и общение ради пустого спора никому не интересно. Что дальше, будем доказывать, что С++ является надмножеством Си? Аргументы по силе просто невероятные: и "не нравится", и "очевидно", и даже "девочки" (точнее, "не девочки"). Ну да ладно, придётся побороть свою природную лень и заглянуть в стандарт ( бесплатный драфт, если что ) с его пунктом 20.7.13. C library : calloc, malloc , free, realloc. Для меня этого достаточно, чтобы обнозначно относить malloc к C library, а не B, C++, D, F, etc. Но читать стандарт, наверное, менее интересно, чем надувать щеки по поводу "очевидно", "не нарвится", "девочки"... Хотя - ради бога, если вам так нравится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.08.2016, 15:21 |
|
||
|
Двумерные массивы и С++
|
|||
|---|---|---|---|
|
#18+
BagaBagaЭх, стоило пропустить пару дней, а тут такие открытия делаются... SashaMercury... просто мне принципиально не нравится когда говорят вещи очевидно не соответствующие действительности. Тут не девочки из детского сада сидят чтобы слушать очевидные глупости, и общение ради пустого спора никому не интересно. Что дальше, будем доказывать, что С++ является надмножеством Си? Аргументы по силе просто невероятные: и "не нравится", и "очевидно", и даже "девочки" (точнее, "не девочки"). Ну да ладно, придётся побороть свою природную лень и заглянуть в стандарт ( бесплатный драфт, если что ) с его пунктом 20.7.13. C library : calloc, malloc , free, realloc. Для меня этого достаточно, чтобы обнозначно относить malloc к C library, а не B, C++, D, F, etc. Но читать стандарт, наверное, менее интересно, чем надувать щеки по поводу "очевидно", "не нарвится", "девочки"... Хотя - ради бога, если вам так нравится. И каким образом из этого следует, что данная функция не имеет никакого отношения к С++? Из того что x принадлежит X не следует, что x не может принадлежать Y. Возможно для вас это не так, потому что вы считаете: BagaBagaAnatoly Moskovsky, тогда у вас весь С входит в С++ как его подмножество... В этом мы немного расходимся. Возможно лучшей аргументацией для вас будет BS и его книга The C++ Programming Language: BSC++ was developed from the C programming language and, with few exceptions, retains C as a subset. The base language, the C subset of C++, is designed so that there is a very close correspondence between its types, operators, and statements and the objects that computers deal with directly: numbers, characters, and addresses. BSClearly, C++ owes much to C [Kernighan,1978]. C is retained as a subset. 0. Вы делаете вывод о том, что функция malloc принадлежит языку С. 1. BS явно говорит о том, что большая часть языка Си (и в том числе функция malloc) являются частью языка С++, также о том, что Си является подмножеством С++ явно и неявно неоднократно говорится в стандарте языка С++. 2. Из п. 0 и п. 1 следует, что функция malloc также является частью С++ Не могли бы вы аргументировано, не ссылаясь на ваши личные суждения опровергнуть эти три пункта, в том случае, если вы с ними не согласны. Вы скажете свою точку зрения, я в ответ ни скажу ни слова по этому вопросу и мы прекратим дискуссию. Просто я хочу понять вас, почему вы рассуждаете так, как вы рассуждаете ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.08.2016, 02:49 |
|
||
|
Двумерные массивы и С++
|
|||
|---|---|---|---|
|
#18+
SashaMercury0. Вы делаете вывод о том, что функция malloc принадлежит языку С. Надеюсь, вы не собираетесь это отрицать? SashaMercury1. BS явно говорит о том, что большая часть языка Си (и в том числе функция malloc) являются частью языка С++, также о том, что Си является подмножеством С++ явно и неявно неоднократно говорится в стандарте языка С++. Я и не утверждаю, что С и С++ не пересекаются вовсе. Но я бы и не стал приписывать старине Бьярне утверждение, что malloc является частью С++. На CppCon он призывает не пользоваться "raw new", а не то что malloc... При этом ссылки на конкретный пункт стандарта, где бы malloc представлялась как часть С++, я от вас так и не дождался. Но есть простые факты: 1. средства управления динамическим выделением памяти описываются пунктом 18.6 Dynamic memory management стандарта. Там есть new и delete в различных вариантах. Там нет malloc и free. 2. malloc и free явным образом (а не "в комментариях по ходу изложения") присутствуют в пункте 20.7.13. C library Наконец, если считать, что malloc есть "натуральная" часть языка С++ для динамического выделения памяти, то каким образом при помощи malloc (и без использования new или inplace new) выделить память в куче для столь же "натурального" объекта С++, как vector, для определенность пусть будет vector <string>? Если покажете "в коде" - мне придётся с вами согласиться. В противном случае получается нонсенс: стандартный механизм С++ для выделения динамической памяти не может быть использован для динамического выделения памяти для любого стандартного объекта С++ (или строже - для любого не-POD-объекта)... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.08.2016, 20:05 |
|
||
|
Двумерные массивы и С++
|
|||
|---|---|---|---|
|
#18+
BagaBaga, все эти потуги вокруг malloc станут ненужными, если приложению требуется работать с несколькими пулами памяти, причём без разницы - C или C++ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.08.2016, 21:05 |
|
||
|
Двумерные массивы и С++
|
|||
|---|---|---|---|
|
#18+
malloc это механизм нижнего уровня по отношению к С++. То что им тоже можно пользоваться, ничего не меняет. Непонятно, что вообще вы хотите доказать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.08.2016, 23:02 |
|
||
|
Двумерные массивы и С++
|
|||
|---|---|---|---|
|
#18+
Здравствуйте. У меня возник ещё один вопрос по двумерным массивам. В стандарте Си сказано следующее: ISO/IEC 9899:201xIf an object that has automatic storage duration is not initialized explicitly, its value is indeterminate. If an object that has static or thread storage duration is not initialized explicitly, then: — if it has pointer type, it is initialized to a null pointer; — if it has arithmetic type, it is initialized to (positive or unsigned) zero; — if it is an aggregate, every member is initialized (recursively) according to these rules, and any padding is initialized to zero bits; — if it is a union, the first named member is initialized (recursively) according to these rules, and any padding is initialized to zero bits; Насколько мне понятно, в том случае если мы выделяем память на массив на стеке Код: plaintext 1. 2. то каждый элемент будет проинициализирован 0 значениями. (В С++ это не работает, я проверил) Аналогичных рассуждений в стандарте С++ я не нашел. Однако нашёл следующее: N4594 8.5.1.12When initializing a multi-dimensional array, the initializer-clauses initialize the elements with the last (rightmost) index of the array varying the fastest (8.3.4). [ Example: Код: plaintext 1. initializes x[0][0] to 3, x[0][1] to 1, x[1][0] to 4, and x[1][1] to 2. On the other hand, Код: plaintext 1. 2. 3. initializes the first column of y (regarded as a two-dimensional array) and leaves the rest zero. —end example ] Исходя из этого, предположил, что такой код: Код: plaintext 1. 2. установит каждый бит данного массива к 0. Однако не нашёл где об этом явно сказано в стандарте языка, и вообще, насколько законны такие действия. Подскажите пожалуйста, насколько это законно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.08.2016, 03:13 |
|
||
|
Двумерные массивы и С++
|
|||
|---|---|---|---|
|
#18+
SashaMercuryВ стандарте Си сказано следующее: ISO/IEC 9899:201xIf an object that has automatic storage duration is not initialized explicitly, its value is indeterminate. If an object that has static or thread storage duration is not initialized explicitly, then: — if it has pointer type, it is initialized to a null pointer; — if it has arithmetic type, it is initialized to (positive or unsigned) zero; — if it is an aggregate, every member is initialized (recursively) according to these rules, and any padding is initialized to zero bits; — if it is a union, the first named member is initialized (recursively) according to these rules, and any padding is initialized to zero bits; Насколько мне понятно, в том случае если мы выделяем память на массив на стеке Код: plaintext 1. 2. то каждый элемент будет проинициализирован 0 значениями. (В С++ это не работает, я проверил) Нет. Вы неверно прочли. Инициализация нулями происходит только для объектов у которых "static or thread storage duration". А стековые (automatic) не инициализируются. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.08.2016, 03:23 |
|
||
|
Двумерные массивы и С++
|
|||
|---|---|---|---|
|
#18+
В С++ - то же самое ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.08.2016, 03:23 |
|
||
|
Двумерные массивы и С++
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyВ С++ - то же самое Очень жаль что нет такой возможности. И странно, что её нет. Думаю это было бы востребовано. А такой код для С++ Код: plaintext 1. 2. тоже нелегален? (на VS всё работает хорошо, все элементы установлены к 0, однако не уверен, что это законно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.08.2016, 03:37 |
|
||
|
Двумерные массивы и С++
|
|||
|---|---|---|---|
|
#18+
SashaMercuryнелегален А где там говорится про нелегальность? Просто переменная содержит неопределенное значение. А сам код вполне легален. SashaMercury(на VS всё работает хорошо, все элементы установлены к 0, однако не уверен, что это законно Наличие инициализатора {} как бы подразумевает явную инициализацию (для чисел - нулями). Так что непонятно что смущает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.08.2016, 03:51 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=39291316&tid=2018442]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
211ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
60ms |
get tp. blocked users: |
1ms |
| others: | 13ms |
| total: | 334ms |

| 0 / 0 |
