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

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

Восстановить пароль Регистрация
Другие темы раздела
C++ Потоки http://www.cyberforum.ru/cpp-beginners/thread340470.html
Всем привет! Делаю тут одну программу(консольную игру), возникла надабность запустить одну и туже функцию в паралельных потоках, т. е. что бы они выполнялись одновременно, как это можно реализовать ? Не имеет значение какие потоки, можно и boost и WinAPI. Зрание спасибо. Добавлено через 55 минут Во к примеру код #include <iostream> #include <cstdlib> #include <ctime> #include <windows.h>...
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 которые я встречал компилировались с соответствующим предупреждением что это новые фичи и они ещё не утверждены. Тем не менее приведённый мною код всё равно компилироваться не хочет посему вопрос: это minigw...
C++ вопрос из С++ для специалистов http://www.cyberforum.ru/cpp-beginners/thread340428.html
По скольку я не могу задавать вопросы в разделе С++ для специалистов,задаю его здесь Была тема Написать функцию, определяющую содержит ли односвязный список циклы (например, последний ссылается на второй). Может я чего то не допонял(просто мне показалось,что приведенные решения были очень раздуты),но в односвязном списке зациклиться может только при участии последнего узла.Если нам...
C++ Вопрос чайника Что означают эти значки (в с++!!!!) : 1) :: 2) -> где они используються и зачем они нужны, скажите простым человеческим языком подробнее

Показать сообщение отдельно
ValeryLaptev
Эксперт C++
1005 / 784 / 46
Регистрация: 30.04.2011
Сообщений: 1,595
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 - это параметр шаблона, который должен быть вычислен на этапе компиляции при инстанцировании шаблона и поставлен в текст функции.
 
Текущее время: 11:37. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru