Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

классы, масиивы, оптимальное использование памяти

43K
08 июля 2013 года
Yokka
14 / / 23.05.2010
Мне надо построить на pictureBox иерархическое дерево. При нажатии на любую вершину будет выводится окошко с информацией об этой вершине. Наверное самый лучший способ представить это дерево с помощью квадратной матрицы, которая состоит с элементов класса (например,
 
Код:
TreeElem[,] arr = new TreeElem[101,101]
)
Вопрос в следующем, оптимально ли это? Если я создам матрицу 1000х1000 из таких элементов какой объем памяти будет заниматься массивом? Если sizeof(TreeElem)*1000*1000, то это много.
414
08 июля 2013 года
CassandraDied
763 / / 24.05.2012
А как ты представляешь себе выделить памяти меньше, чем занимают сами данные, то есть вершины?
446
08 июля 2013 года
Meander
487 / / 04.09.2011
По моему, бинарное дерево поиска - классический способ борьбы с диким расходом памяти и разреженными матрицами. С другой стороны, если sizeof(TreeElem) 1байт, то будет занято менее 1 Мб, если 1кб - менее гигабайта, что в любом случае не так много для современных компов.
43K
08 июля 2013 года
Yokka
14 / / 23.05.2010
вот на плюсах можно было создать массив ссылок и в конкретные ячейки записывать адрес экземпляра класса. Хочется сделать что-то подобное.

Если сделать так: TreeElem[,] arr = new TreeElem[101,101], то сколько будет занимать памяти созданный массив где все ячейки будут null?
414
08 июля 2013 года
CassandraDied
763 / / 24.05.2012
Да столько же. В C# всё, что наследуется от Object — ссылочный тип. В том числе и классы, и массивы.
Вперёд читать про ссылочные типы в C#.
446
08 июля 2013 года
Meander
487 / / 04.09.2011
По идее он будет равен sizeof(TreeElem)*101*101, независимо от того, что будет в ячейках.
414
09 июля 2013 года
CassandraDied
763 / / 24.05.2012
Код:
public class node : Object
    {
        public int _x;
        public string _z;

        public node(int x = 0, string z = "aaa")
        {
            _x = x;
            _z = z;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            node[,] arr;
            long emptyArr = GC.GetTotalMemory(true);
            arr = new node[100, 100];
            long allocatedArr = GC.GetTotalMemory(true);
            //до этих циклов в массиве одни null
            for (int i = 0; i < 100; ++i)
                for (int j = 0; j < 100; ++j)
                    arr[i, j] = new node(i + j, i.ToString() + j.ToString() + DateTime.Now.ToShortDateString());
            long initializedArr = GC.GetTotalMemory(true);
            long total = initializedArr - emptyArr;

            Console.WriteLine(
@"empty: {0}
allocated: {1}
initialized: {2}
total: {3}
per element: {4}
per elem b4 init: {5}"
,
            emptyArr,
            allocatedArr,
            initializedArr,
            total,
            (total / (100 * 100)),
            (allocatedArr - emptyArr) / (100 * 100));

            Console.ReadKey();
        }
    }
43K
09 июля 2013 года
Yokka
14 / / 23.05.2010
Спасибо)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог