Идея заключается в том, что для соображений скорости и кеширования операнды должны считываться с адресов, соответствующих их естественному размеру. Чтобы это произошло, элементы структуры компоновщика компилируются так, чтобы следующий член или следующая структура были выровнены.
struct pixel {
unsigned char red; // 0
unsigned char green; // 1
unsigned int alpha; // 4 (gotta skip to an aligned offset)
unsigned char blue; // 8 (then skip 9 10 11)
};
// next offset: 12
Архитектура x86 всегда могла извлекать неверные адреса. Тем не менее, он медленнее, и когда несоосность перекрывает две разные строки кэша, тогда он вытесняет две строки кэша, когда выровненный доступ будет вытеснять только один.
Некоторым архитектурам на самом деле приходится ловить ложные недочетые чтения и записи и ранние версии архитектуры ARM (той, которая развивалась во всех современных мобильных процессорах) ... ну, на самом деле они просто вернули для них плохие данные. (Они проигнорировали младшие разряды.)
Наконец, обратите внимание, что строки кэша могут быть сколь угодно большими, а компилятор не пытается угадать их или сделать компромисс между пространством и скоростью. Вместо этого решения выравнивания являются частью ABI и представляют собой минимальное выравнивание, которое в конечном итоге равномерно заполняет линию кэша.
Значения TL; DR: важны.
Вот иначе, кажется более прямым.
object anon = Activator.CreateInstance(existingObject.GetType());
Вы могли бы хотеть изучить ДОЛЛАР. Я, которым havn't, сделанный так сам (все же), но пример использования за ДОЛЛАР (динамические языки), звучит много как то, что Вы пытаетесь сделать.
В зависимости от того, что Вы хотите сделать, динамический объект платформы Замка прокси мог бы быть подходящим вариантом также.
Можно использовать Отражение. Испустите для генерации необходимых классов динамично, хотя это довольно противно для кодирования.
Если бы Вы выбираете этот маршрут, я предложил бы загрузить Отражение, Испускают Дополнение Языка для Отражателя.NET, поскольку это позволяет Вам видеть, как существующие классы были бы созданы с помощью Отражения. Испустите, следовательно хороший метод для изучения этого угла платформы.
Да, существует. Из памяти:
public static T create<T>(T t)
{
return Activator.CreateInstance<T>();
}
object anon = create(existingAnonymousType);
Используйте отражение, чтобы получить Тип, использовать GetConstructor на типе, использование Вызывают на конструктора.
Править: Благодаря Sklivvz для указания, что я ответил на вопрос, который не задали ;)
Ответ на фактический вопрос: я нашел, что генерация код C# и затем использование CodeDomProvider (но не сам CodeDOM - ужасный) и затем компиляция, которая вниз и отражающиеся типы из этого является самым легким способом сделать 'анонимные' объекты во времени выполнения.
Вы могли бы также хотеть взглянуть в класс FormatterServices: запись MSDN на FormatterServices
Это содержит GetSafeUninitializedObject, который создаст пустой экземпляр класса и несколько других удобных методов при выполнении сериализации.
В ответ на комментарий от Michael: Если у Вас нет экземпляра Типа для типа T, можно всегда получать его от typeof (T). Если у Вас есть объект неизвестного типа, можно вызвать GetType () на нем для получения экземпляра Типа.