Что обозначает данная запись, что собственно она делает?
int var = 100;
int * ptr = &var;
Правильно ли я понимаю, что здесь не происходит выделения памяти?
Так я попробовал запустить программу в которой в цикле из 100тыс итераций меняются адреса, но никакого приращения памяти в таскМенеджере я не увидел вообще... когда как если бы это было бы выделение через new, тогда все эти выделения дают прирост аж почти в 5Мб, хотя по подсчетам для 32 битной программы утечка должна быть в размере 4 байта * 100000 выделений = 400тыс байтов, что составляет всего ~0.4 Мб Против 5. Разница более чем в 12 раз... Но это уже второй вопрос, из каких соображений получилась такая утечка)))
Другие языки программирования и технологии
С++ Указатели, утечка памяти и т. д.
int var = 100;
int * ptr = &var;
Правильно ли я понимаю, что здесь не происходит выделения памяти?
Ну как бы не совсем так...
int var - это будет занимать сколько то места но не менее 16 бит по спецификации
int *ptr - и это тоже будет занимать сколько то места, а тут для 32 разрядной будет 32 бита, а для 64 разрядной 64 бита занимать, если не ошибаюсь.
Едем далее по вопросу... Если запихнуть это в цикл или в функцию, да в принципе куда угодно, выделится только две переменные это переменная int и указатель на int(имена не вижу смысла писать и так понятно что есть что). Так что проверки этого в цикле не вижу смысла.
Что же по второму вопросу. Уже все не помню, нужно проверять сказанное мной после этой фразы. При выделении памяти при помощи new выделяется памяти больше чем требуется и адрес памяти будет кратен 16(выравнивание данных на адрес кратный 16 помогает процессору быстрей обращаться к данным) Поэтому попробуйте выделять память по 4 int или числу кратному 16 байт и понаблюдать за результатом. Плюс вопрос а как сохраняются указатели на выделенную память!? Они же тоже чего-то весят...
Как видим на скрине я оказался прав и выравнивание происходит на 16(нолики в конце у всех адресов стоят) А минимальный размер памяти между указателями составил 0x20 то есть 32 байта - это минимум видимо что может выделить new или винда, тут хз кто так решает. Так что при выделении 4 байт вы получаете минимум 32 байта, то есть в 8 раз больше. Так что не выделяйте память такими мелкими кусочками. И да 32*100000 = 3200000 и это чуть больше чем 3Мб, осталось понять куда 2Мб девалось!)))

int * ptr = &var;
Правильно ли я понимаю, что здесь не происходит выделения памяти?
Ну как бы не совсем так...
int var - это будет занимать сколько то места но не менее 16 бит по спецификации
int *ptr - и это тоже будет занимать сколько то места, а тут для 32 разрядной будет 32 бита, а для 64 разрядной 64 бита занимать, если не ошибаюсь.
Едем далее по вопросу... Если запихнуть это в цикл или в функцию, да в принципе куда угодно, выделится только две переменные это переменная int и указатель на int(имена не вижу смысла писать и так понятно что есть что). Так что проверки этого в цикле не вижу смысла.
Что же по второму вопросу. Уже все не помню, нужно проверять сказанное мной после этой фразы. При выделении памяти при помощи new выделяется памяти больше чем требуется и адрес памяти будет кратен 16(выравнивание данных на адрес кратный 16 помогает процессору быстрей обращаться к данным) Поэтому попробуйте выделять память по 4 int или числу кратному 16 байт и понаблюдать за результатом. Плюс вопрос а как сохраняются указатели на выделенную память!? Они же тоже чего-то весят...
Как видим на скрине я оказался прав и выравнивание происходит на 16(нолики в конце у всех адресов стоят) А минимальный размер памяти между указателями составил 0x20 то есть 32 байта - это минимум видимо что может выделить new или винда, тут хз кто так решает. Так что при выделении 4 байт вы получаете минимум 32 байта, то есть в 8 раз больше. Так что не выделяйте память такими мелкими кусочками. И да 32*100000 = 3200000 и это чуть больше чем 3Мб, осталось понять куда 2Мб девалось!)))

Эта программа в Release x86 занимает 508 kB
#include <cstdlib>
int main() {
//static short n = 100'000;
//do new int; while (--n);
system("pause");
}
Эта программа в Release x86 занимает 1068 kB
#include <cstdlib>
int main() {
static short n = 100'000;
do new int; while (--n);
system("pause");
}
Разница составляет 560 kB, их которых около 390 kB составляет утечка.
Вы же свою программу запускаете в режиме отладки.
#include <cstdlib>
int main() {
//static short n = 100'000;
//do new int; while (--n);
system("pause");
}
Эта программа в Release x86 занимает 1068 kB
#include <cstdlib>
int main() {
static short n = 100'000;
do new int; while (--n);
system("pause");
}
Разница составляет 560 kB, их которых около 390 kB составляет утечка.
Вы же свою программу запускаете в режиме отладки.
никакая это не утечка, а просто особенность работы системы. курсором достаточно повести и память может увеличиться.
Hursand Saburow
у меня консольное приложение. Ничего кроме утечек в нем и нет. Если на то пошло, тогда и в первом случае должен был наблюдаться рост оперативной памяти по приложению, но этого не было, так как утечки там нет.
выделение памяти здесь происходит только в стеке как при обычной переменной. когда дойдет до } очистится сама.
Улан Нусипхожа
Здесь не происходит выделения памяти вообще. Память на стеке выделяется перед выполнением.
Улан Нусипхожа
Утечка происходит только на время выполнения программы, кстати.
Таким образом как ты, никто количество памяти не мерит.
Таким образом как ты, никто количество памяти не мерит.
Определение переменной - это всегда выделение памяти для этой переменной. В вашем обрывке кода присутствует определение двух переменных, т. е. производится выделение памяти для них.
Из вашего обрывка кода, однако, не ясно, в каком контексте сделаны эти объявления, т. е. невозможно ответить на вопрос, являются ли эти переменные статическими или автоматическими. Но в любом случае, менеджмент памяти для статических или автоматических переменных делается языком. Вам от этом беспокоиться не нужно. Никакой утечки памяти в этом коде нет.
Утечка памяти возможна только при динамическом выделении памяти. В приведенном вами коде никакого динамического выделения памяти нет.
Из вашего обрывка кода, однако, не ясно, в каком контексте сделаны эти объявления, т. е. невозможно ответить на вопрос, являются ли эти переменные статическими или автоматическими. Но в любом случае, менеджмент памяти для статических или автоматических переменных делается языком. Вам от этом беспокоиться не нужно. Никакой утечки памяти в этом коде нет.
Утечка памяти возможна только при динамическом выделении памяти. В приведенном вами коде никакого динамического выделения памяти нет.
Рома Плетінка
Далеко не всегда. В т. ч. переменная может быть оптимизирована до напрямую работы с регистрами процессора.
Улан Нусипхожа
Не выделение памяти, а создание переменной, без всяких выделений. Во время выполнения память выделяется только в куче.
Похожие вопросы
- Как при помощи команды tasklist вывести только память процессов без PID, Имя сессии и т. д.
- По поводу битов, байтов и т. д.
- вчера поймал баннер виндовс заблокирован и т. д. откатил систему вроди все норм. но сегодня стала твориться мистика.
- Почему программисты, сидящие здесь, хотят, чтобы в школах вместо паскаля изучали С++ C# и т.д.?
- Как выучиться на программиста в домашних условиях. Какие хорошие книги и т.д. Какие хорошие книги и т.д
- Реально ли научиться хорошо рисовать, не учившись в художественной школе или в институте на художественном и т. д.
- В пн. выхожу на работу в компанию которая занимается разработкой веб-сайтов, флеш сайтов, флеш-игр и т. д. ПОМОГИТЕ!!!
- Как правильно создавать свой сайт и викладывать там свои проги и т. д
- В преддверии скандалов о всемирной слежке АНБ, Сноудене и т. д. Как думаете
- Можно ли самостоятельно,без препода,по учебникам научиться программированию и создавать браузеры,типа Оперы и т.д...,
Есс-но идеала никогда не достичь. В т. ч. из-за накладных расходов выделение памяти страницами/параграфами и т.. д.