2014-09-11 3 views
3

Я заметил, что примитивные типы в C# действительно просто реализованы как псевдонимы для структур, определенных в пространстве имен System, например. ulong является псевдонимом System.UInt64, который имеет тип struct. Есть ли дополнительные дополнительные временные накладные расходы для примитивных типов в C#, возникающих из этого? Скажем, действительно ли ulong потребляет всего 8 байт памяти?Структурировать служебные данные псевдонимов примитивного типа C#?

В духе, это должно проверить накладные расходы памяти:

using System; 

class Program 
{ 
    static void Main() 
    { 
     long beforeAlloc = GC.GetTotalMemory(false); 
     ulong[] myArray = new ulong[System.Int32.MaxValue]; 
     myArray[0] = 1; 
     long afterAlloc = GC.GetTotalMemory(false); 

     Console.WriteLine(((afterAlloc - beforeAlloc)/System.Int32.MaxValue).ToString()); 
    } 
} 

Но documentation указывает, что GC.GetTotalMemory() метод извлекает только число байтов в настоящее время думал выделяться, поэтому не существует простой способ найти без более сложного профилирования памяти?

+2

Нет накладных расходов. – Lee

+1

Каковы ваши рассуждения, почему накладные расходы? – Shoe

ответ

3

Наверху не существует накладных расходов. Тем не менее, среда выполнения может свободно размещать любые составные типы в качестве оптимизации выравнивания.

Подробнее о том, как массивы обрабатываются во время работы, см. this question.

+0

Спасибо! У меня есть 2 вопроса о последующих действиях, (1) Есть ли какой-нибудь быстрый, но более надежный подход, чем 'GC.GetTotalMemory()' для проверки этой гипотезы? (2 - не относится к основному вопросу). Поскольку среда выполнения использует составные типы, есть ли преимущество переустановки элементов структуры от большого до небольшого размера стандарта a la C? – elleciel

+1

Это зависит от того, что вы ищете. Помните, что CLR действует как менеджер по имени от имени вашего приложения, поэтому он будет выделять и освобождать память на уровне ОС. Реальный вопрос здесь, вероятно, почему вы хотите знать? –

+0

Просто из любопытства. Я играл с местоположениями структур, выделенных на разных частях адресного пространства на C, и решил посмотреть на другие языки и наткнулся на эту странную спецификацию на C#. Я думаю, это хороший трюк, чтобы узнать, могу ли я сжать структуру в 1 или 2 строки кэша, переставив элементы структуры. :) – elleciel

1

Примитивные типы сглажены компилятором. В полученном коде нет разницы, используете ли вы int или System.Int32. В вашем примере System.UInt64 и ulong - это две структуры; они оба наследуются от System.ValueType. Это потому, что на самом деле они одного типа.

Однако, если вы используете ключевые слова, компилятор будет немного быстрее. Когда вы используете, например, Int32, компилятор разрешает имя типа из всех других типов в области видимости, обращая внимание на пространство имен и директивы using, чтобы определить, что тип не является каким-либо другим типом Int32, который написал кто-то другой. Это не происходит с псевдонимами.

Если вы можете найти пример, где это различие действительно измеримо, я был бы очень удивлен!

Смежные вопросы