Память взята от объекта c#

@palmsey: Объективности ради по отношению к OP документы JavaScript на самом деле явно относятся к использованию переменных текстового объекта этим способом как "ассоциативные массивы".

И объективности ради по отношению к @palmsey он был довольно корректен, они не ассоциативные массивы, они - определенно объекты :) - выполнение задания ассоциативного массива. Но в отношении более широкой точки Вы определенно, кажется, имеете право его в соответствии с этой довольно прекрасной статьей, которую я нашел:

“Associative Arrays” JavaScript, Продуманный Вредный

, Но согласно всему этому, [разве] эти , не принят, отвечают самому плохая практика?

Указывают опытный размер () функция для Объекта

, Если что-либо еще было добавлено для Возражения .prototype, затем предложенный код перестанет работать:


я не думаю, что ответ должен быть принятым, поскольку он не может быть доверен работе, если у Вас есть какой-либо другой код, работающий в том же контексте выполнения. Чтобы сделать это устойчивым способом, конечно, необходимо было бы определить метод размера в myArray и проверке на тип участников, поскольку Вы выполняете итерации через них.

9
задан George Statis 13 August 2009 в 16:22
поделиться

3 ответа

Хорошо, поскольку и Эндрю, и Гуффа дали ответы, которые я считаю неправильными ...

Есть 8-байтовые накладные расходы для всех объектов (на x86), но есть также минимальный размер 12 байт. Я не знаю почему ... но это означает, что эти два класса оба занимают по 12 байтов на экземпляр:

public class OneField
{
    private int field;
}

public class NoFields
{
}

Тест:

using System;

public class OneField
{
    private int field;
}

public class NoFields {}

public class Test
{
    static void Main(string[] args)
    {
        int size = int.Parse(args[0]);
        switch (args[1])
        {
            case "NoFields":
                TestNoFields(size);
                break;
            case "OneField":
                TestOneField(size);
                break;
        }
    }

    static void TestNoFields(int size)
    {
        NoFields[] array = new NoFields[size];
        long start = GC.GetTotalMemory(true);
        for (int i=0; i < size; i++)
        {
            array[i] = new NoFields();
        }
        long end = GC.GetTotalMemory(true);
        GC.KeepAlive(array);
        Console.WriteLine("Size per instance: {0}",
                          (end-start) / (double)size);
    }

    static void TestOneField(int size)
    {
        OneField[] array = new OneField[size];
        long start = GC.GetTotalMemory(true);
        for (int i=0; i < size; i++)
        {
            array[i] = new OneField();
        }
        long end = GC.GetTotalMemory(true);
        GC.KeepAlive(array);
        Console.WriteLine("Size per instance: {0}",
                          (end-start) / (double)size);
    }
}

Это уродливо, потому что я намеренно не использовал общие типы или что-то еще, что могло вызвать проблемы. Несколько тестовых прогонов:

>test 1000000 NoFields
Size per instance: 12.000024
>test 1000000 OneField
Size per instance: 12.000024
>test 1000 NoFields
Size per instance: 12
>test 1000 OneField
Size per instance: 12

(Накладные расходы JIT и т. Д. Объясняют, почему число не всегда является точным целым числом - поэтому я делаю деление с плавающей запятой.)

Тестирование с дополнительным полем int показывает, что использование увеличивается до 16, что доказывает, что он действительно делает что-то разумное :)

11
ответ дан 4 December 2019 в 14:30
поделиться

У объекта есть две ссылки / указатели в дополнение к его собственным данным.

Итак, в 32-битной системе объект занимает 8 байтов, в 64-битной системе - 16 байтов. .

Исправление:
Как заявил Джон, минимальный размер объекта составляет 12 байтов. Информация, которую я нашел до сих пор, говорит, что этого требует сборщик мусора.

3
ответ дан 4 December 2019 в 14:30
поделиться

Единственные накладные расходы, которые вы понесете при использовании ссылочного типа, будут составлять 4 байта для указателя объекта типа и 4 байта для индекса блока синхронизации.

Итого 8 байт служебных данных.

0
ответ дан 4 December 2019 в 14:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: