Я в этом не шарю
3 / 3 / 3
Регистрация: 03.09.2014
Сообщений: 191
1

Почему, если я объявляю массив, он весит больше?

14.01.2015, 12:42. Показов 1322. Ответов 23
Метки нет (Все метки)

задаю массив
C++
1
char*array = new char[512];
а в оперативе массив занимает 4 килобайта.
почему так происходит, и как такого избежать?
росто стараюсь экономить память, ато в базе данных много, весят они мало, но при загрузке в память занимают в несколько раз больше.
компиль MinGW
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.01.2015, 12:42
Ответы с готовыми решениями:

Почему ссылка весит больше переменной
Почему ссылка весит больше переменной <?php $a=memory_get_usage(); $bar = &$foo;...

Больше фруктов. Определить, что весит больше - яблоки или апельсины
Больше фруктов. Одно яблоко весит 100 гр., а один апельсин 150 гр.Вам дают заданное кол-во яблок...

Что больше весит? :))
Доброго времени суток, уважаемы программисты! У меня нестандартненький вопросик :) Что больше...

Кириллица в структуре весит в 2 раза больше
#include <stdio.h> #include <string.h> #include <stdlib.h> struct namect{ char *fname;...

23
Эксперт по математике/физикеЭксперт С++
1942 / 1280 / 367
Регистрация: 16.05.2013
Сообщений: 3,339
Записей в блоге: 6
14.01.2015, 12:50 2
Потому, что 4кб это размер страницы на жестком диске и меньше его сделать нельзя. Просто пишите свою базу с учетом данной специфики устройства железа.
0
7063 / 6074 / 2764
Регистрация: 14.04.2014
Сообщений: 26,086
14.01.2015, 13:05 3
Ilot, о какой странице речь?
0
Я в этом не шарю
3 / 3 / 3
Регистрация: 03.09.2014
Сообщений: 191
14.01.2015, 13:06  [ТС] 4
Ilot, я имел ввиду оперативную память
0
Ушел с форума
Эксперт С++
16429 / 7393 / 1186
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
14.01.2015, 13:13 5
Цитата Сообщение от Segaman Посмотреть сообщение
а в оперативе массив занимает 4 килобайта.
Далеко не факт.
new - это функция рантайма C++, она может реализовывать
выделение памяти как угодно.
0
7063 / 6074 / 2764
Регистрация: 14.04.2014
Сообщений: 26,086
14.01.2015, 13:14 6
А как ты вообще определил, что там 4 килобайта?
0
172 / 130 / 74
Регистрация: 04.12.2013
Сообщений: 552
14.01.2015, 13:18 7
Segaman, ваш массив занимает 512 байт в куче (в блоке оперативной памяти).
0
Почетный модератор
Эксперт С++
5843 / 2853 / 390
Регистрация: 01.11.2011
Сообщений: 6,903
14.01.2015, 13:22 8
Цитата Сообщение от nmcf Посмотреть сообщение
о какой странице речь?
о виртуальной памяти.

Цитата Сообщение от Убежденный Посмотреть сообщение
выделение памяти как угодно.
А как это можно прояснить в рантайме?
0
Jesus loves me
Эксперт С++
5196 / 3167 / 357
Регистрация: 12.12.2009
Сообщений: 8,006
Записей в блоге: 2
14.01.2015, 13:22 9
Цитата Сообщение от Ilot Посмотреть сообщение
это размер страницы на жестком диске
может все таки в ОЗУ? на жестком диске нет страниц.
0
SatanaXIII
14.01.2015, 13:25
  #10

Не по теме:

Цитата Сообщение от Kastaneda Посмотреть сообщение
на жестком диске нет страниц.
А вы его открывали? Х)

0
Kastaneda
14.01.2015, 13:33
  #11

Не по теме:

Цитата Сообщение от SatanaXIII Посмотреть сообщение
А вы его открывали?
нет, но пробовал так
Bash
1
find / -name page
не находит почему-то :)

0
2725 / 1888 / 560
Регистрация: 05.06.2014
Сообщений: 5,504
14.01.2015, 13:41 12
Цитата Сообщение от Segaman Посмотреть сообщение
а в оперативе массив занимает 4 килобайта.
почему так происходит, и как такого избежать?
Потому что физическая память выделяется страницами. Если регулярно идет подобный перерасход памяти, значит скорее всего имеет место быть жуткая фрагментация хипа. Вариант лечения - собственные аллокаторы, заточенные под фиксированный размер выделяемого блока памяти. Если, конечно, вы эту фиксированность можете гарантировать.
0
Эксперт по математике/физикеЭксперт С++
1942 / 1280 / 367
Регистрация: 16.05.2013
Сообщений: 3,339
Записей в блоге: 6
14.01.2015, 14:10 13
Segaman, в оперативной памяти храняться именно страницы, так как в windows организованна страничная система управления памятью. И упирается это в размер сектора на жестком диске. Так как в винде используется вытесняющая система управления памятью то при выгрузке из ОЗУ блока памяти приложения не кратного размеру сектора вопрос как ее записать на жесткий диск или затем загрузить опять в ОЗУ?
0
Ушел с форума
Эксперт С++
16429 / 7393 / 1186
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
14.01.2015, 14:25 14
Цитата Сообщение от Segaman Посмотреть сообщение
char*array = new char[512];
На известных мне реализациях здесь вообще не будет выделено никакой физической
памяти, до момента первого обращения к массиву. А расход виртуальной памяти - это
довольно скользкое понятие. Например, аллокатор C++ может выделить одну страницу
памяти и разместить весь массив в ней. А может использовать уже выделенные
страницы памяти и поместить массив туда. Причем массив может целиком уместиться
внутри одной страницы. А может попасть на границу страниц. Во всех трех случаях
фактический расход виртуальной памяти будет разным. А о том, что произойдет на
самом деле, можно лишь догадываться. Да, и хотелось бы отметить напоследок,
что встроенные аллокаторы C/C++ не настолько тупые, чтобы выделять по 4 КБ
на каждый чих.
0
Jesus loves me
Эксперт С++
5196 / 3167 / 357
Регистрация: 12.12.2009
Сообщений: 8,006
Записей в блоге: 2
14.01.2015, 14:39 15
Цитата Сообщение от Убежденный Посмотреть сообщение
На известных мне реализациях здесь вообще не будет выделено никакой физической
памяти, до момента первого обращения к массиву
Получается он просто виртуальные адреса резервирует? Я наблюдал такое поведение на 64-битном Linux'е, но на 64-битной винде это уже не проявлялось.

Добавлено через 35 секунд
Точнее на винде есть передел на виртуальные адреса, а на Linux'е его нет.
0
Ушел с форума
Эксперт С++
16429 / 7393 / 1186
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
14.01.2015, 15:23 16
Цитата Сообщение от Kastaneda Посмотреть сообщение
Получается он просто виртуальные адреса резервирует?
Не совсем так. Память коммитится, т.е. обеспечивается имеющимся в системе
ресурсом ОЗУ/подкачки, но реальное проецирование виртуальных страниц памяти на
физические откладывается до того момента, пока к ним не начнут обращаться.
При доступе к такой странице происходит page fault и система загружает
ее в оперативку. Собственно, это вратце описано и в документации:

VirtualAlloc function
http://msdn.microsoft.com/en-u... 85%29.aspx
MEM_COMMIT

Allocates memory charges (from the overall size of memory and the paging files on disk)
for the specified reserved memory pages. The function also guarantees that when the
caller later initially accesses the memory, the contents will be zero. Actual physical
pages are not allocated unless/until the virtual addresses are actually accessed.
Простой эксперимент: выделяем буфер, к примеру, в 100 метров, смотрим показатель
"Working Set" процесса в диспетчере задач - он практически не изменится.
А теперь пройдем в цикле весь буфер и "стукнем молоточком" по каждой страничке -
показатель подскочит до соответствующего значения.
0
Jesus loves me
Эксперт С++
5196 / 3167 / 357
Регистрация: 12.12.2009
Сообщений: 8,006
Записей в блоге: 2
14.01.2015, 15:29 17
Просто я на 64-битном линуксе наблюдал такое - можно выделить хоть терабайт памяти (понятно, что оперативы в разы меньше) и не получить никакого std::bad_alloc(). Проблема случится при обращении в память.
0
Эксперт по математике/физикеЭксперт С++
1942 / 1280 / 367
Регистрация: 16.05.2013
Сообщений: 3,339
Записей в блоге: 6
14.01.2015, 15:36 18
Дополню предыдущего оратора(Убежденный). Для каждого процесса доступно 4Гб виртуальной памяти. Т.е. программа может обратиться по адресам разбросанным в данном интервале. Однако реально операционная система выделяет физическую память только для тех адресов которые запрашивает приложение. Если память под запрошенный адрес выделена происходит обращение к ней(если она храниться в ОЗУ, либо подгружается из жесткого диска) в противном случае ось выделяет одну страницу(или несколько - зависит от запроса) в ОЗУ содержащую указанный адрес(имеется ввиду виртуальная адресация).
Таким образом по сабжу при запросе памяти для массива ось выделяет в ОЗУ блок памяти размером в одну страницу и проецирует ее на виртуальное адресное пространство процесса. Затем, если потребуется, выделить память она будет распределена в указанной странице либо будет запрошенна дополнительная память.
0
Ушел с форума
Эксперт С++
16429 / 7393 / 1186
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
14.01.2015, 15:40 19
Цитата Сообщение от Kastaneda Посмотреть сообщение
Просто я на 64-битном линуксе наблюдал такое - можно выделить хоть терабайт памяти (понятно, что оперативы в разы меньше) и не получить никакого std::bad_alloc(). Проблема случится при обращении в память.
На 64-битной Windows (в 64-битном процессе) будет примерно такая же картина.
0
Почетный модератор
Эксперт С++
5843 / 2853 / 390
Регистрация: 01.11.2011
Сообщений: 6,903
14.01.2015, 15:46 20
Цитата Сообщение от Ilot Посмотреть сообщение
Для каждого процесса доступно 4Гб виртуальной памяти
Сейчас понесется про 2:2 и 3:1 Гб.
Цитата Сообщение от Kastaneda Посмотреть сообщение
оперативы в разы меньше
Вот кстати про засвопленную память не надо забывать.
Цитата Сообщение от Ilot Посмотреть сообщение
Таким образом по сабжу при запросе памяти для массива ось выделяет в ОЗУ блок памяти размером в одну страницу и проецирует ее на виртуальное адресное пространство процесса. Затем, если потребуется, выделить память она будет распределена в указанной странице либо будет запрошенна дополнительная память.

Если соответственно памяти требуется больше, чем влезает в одну страницу, то в оперативной памяти физически освободится требуемое количество байт, дополненных до целого количества страниц.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.01.2015, 15:46

Какая часть пачек сахара весит больше 1.03 кг
Вес упаковки сахара нормально распределен со средним значением 1 кг. Известно, что 20% из всех...

Папка windows весит 32,8 ГБ! почему?
Когда нажимаешь на свойства папки windows, он выдает: Размер: 32,8 ГБ (35*308*517*308 байт)...

Создать динамический массив (Если чётных чисел больше, то массив должен быть укорочен на 2 элемента)
Создать динамический массив из 8 случайных целых чисел из отрезка и вывести его на экран . Если...

Почему скомпилированый исходиник в Delphi 10 весит 20 мегабайт?
Писал себе программу, ниче особого она не делает. В ней не три километра кода. Ни каких внутренних...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.