классы, масиивы, оптимальное использование памяти
Код:
TreeElem[,] arr = new TreeElem[101,101]
Вопрос в следующем, оптимально ли это? Если я создам матрицу 1000х1000 из таких элементов какой объем памяти будет заниматься массивом? Если sizeof(TreeElem)*1000*1000, то это много.
А как ты представляешь себе выделить памяти меньше, чем занимают сами данные, то есть вершины?
По моему, бинарное дерево поиска - классический способ борьбы с диким расходом памяти и разреженными матрицами. С другой стороны, если sizeof(TreeElem) 1байт, то будет занято менее 1 Мб, если 1кб - менее гигабайта, что в любом случае не так много для современных компов.
Если сделать так: TreeElem[,] arr = new TreeElem[101,101], то сколько будет занимать памяти созданный массив где все ячейки будут null?
Вперёд читать про ссылочные типы в C#.
По идее он будет равен sizeof(TreeElem)*101*101, независимо от того, что будет в ячейках.
Код:
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();
}
}
{
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();
}
}
Спасибо)