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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Потоки http://www.cyberforum.ru/cpp-beginners/thread340470.html
Всем привет! Делаю тут одну программу(консольную игру), возникла надабность запустить одну и туже функцию в паралельных потоках, т. е. что бы они выполнялись одновременно, как это можно реализовать...
C++ Контейнер для файлов Всем привет, у меня вопрос. Вот у меня есть файл формата допустим *.dat, как мне в этот файл засунуть файлы формата допустим *.jpg? Пожлуйста помогите, очень надо. http://www.cyberforum.ru/cpp-beginners/thread340466.html
Сравнить строки и по количеству символов, и по коду C++
народ какая функция строки сравнивает, и по количеству символов, и по коду strcmp - как-то плохо сравнивает у меня строка "9" больше строки "333"
Инициализация вектора в стиле С++0х C++
У меня связка последний Code::Blocks+ последний minigw, но в коде вот такая инициализация вектора: vector<int> ar={1,2,3,4,5,6}; почему-то не работает, притом что остальные фичи от C++0x которые я...
C++ вопрос из С++ для специалистов http://www.cyberforum.ru/cpp-beginners/thread340428.html
По скольку я не могу задавать вопросы в разделе С++ для специалистов,задаю его здесь Была тема Написать функцию, определяющую содержит ли односвязный список циклы (например, последний ссылается...
C++ Вопрос чайника Что означают эти значки (в с++!!!!) : 1) :: 2) -> где они используються и зачем они нужны, скажите простым человеческим языком подробнее

Показать сообщение отдельно
ValeryLaptev
Эксперт С++
1041 / 820 / 48
Регистрация: 30.04.2011
Сообщений: 1,659
09.08.2011, 16:54
Цитата Сообщение от Сыроежка Посмотреть сообщение
Любое определение объекта сопровождается выделением памяти! Вопрос только в том, где и как выделяется память.
В первом случае у вас выделяется память в стеке, во втором случае у вас память выделяется в кучи.

Но главное, о чем здесь не упомянули, эти два опреде6ления объявляют два разных типа данных! В первом случае вы действительно определяете массив, а во-втором случае вы определяете указатель. В С++ особенно существенна разница между указателями и массивами, так как sizeof массива отличается от sizeof указателя. И кроме того в С++ могут быть определены функции, аргументами которых являются ссылки на массив. То есть в С++ можно в функции в качестве параметра передавать массивы.

Посмотрите пример шаблонной функции

C++
1
2
template <typename T, size_t N>
inline size_t array_size( const T ( & )[ N ] ) { return ( N ); }
Я набирал код "на коленках", поэтому в нем могут быть ошибки, но идея понятна: функция позволяет вернуть размерность массива. Для указателей она работать не будет.
Уточню.
1. Массив можно определить не только как локальный, но и как глобальный. Только для локального массива память выделяется в стеке во время работы программы. Для глобального массива память распределяет компилятор и эта память в стандарте называется static storage. Там же размещаются и статические переменные, даже локальные. Нестатические локальные переменные размещаются в автоматической памяти (automation - если не наврал - storage). Стандарт не говорит, что должен быть именно стек. Просто издревле локальные переменные размещались в стеке ВО ВРЕМЯ ВЫПОНЕНИЯ программы. Размещение в стеке массива сразу ограничивает его размер до размера стека, выделяемого по умолчанию операционной системой для программы. Размер можно увеличить, но это надо уже устанавливать режимы линкера.
Размер массива должен быть константным выражением.

2. Во втором случае, как сказал Сыроежка, мы имеем указатель, который проинициализирован адресом первого элемента массива. Причем это делается тоже ВО ВРЕМЯ ВЫПОЛНЕНИЯ программы. Отличие от первого случая - это vds делаем сами, ручками, явными операциями. В первом случае массив автоматом уничтожается, а во втором случае мы должны его убить явно сами операцией delete[]. Размер массива может вычисляться во время работы программы. Подобный массив размещается в динамической памяти (это третий вид памяти для объектов в С++ - dynamic storage). Опять же, как реализовать эту память стандарт не оговаривает.

3. Шаблонная функция, которую написал Сыроежка - это к памяти вообще отношения не имеет. N - это параметр шаблона, который должен быть вычислен на этапе компиляции при инстанцировании шаблона и поставлен в текст функции.
0
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru