Можно ли реализовать типы значений путем встраивания? - PullRequest
2 голосов
/ 11 сентября 2011

Когда я впервые увидел типы значений в C #, первое, что я подумал, было: «Вау, какая замечательная оптимизация», во-вторых, «нам действительно нужна новая языковая конструкция? Разве мы не можем сделать это с помощьюаннотации вместо? ".

Идея в том, что, учитывая класс, мы будем использовать его, как мы всегда это делали

class A {int i;}
class B {
    A m_a;
    int F(A a) {m_a = a;}
}

По прихоти мы изменим A на

[ValueType]
class A {int i;int j;}

И компилятор автоматически преобразует класс B в

class B {
#region A
    int A_i;
    int A_j;
#endregion
int F(/*A param*/int i,int j) {
#region A_assign
    A_i = i;
    A_j = j;
#endregion
}

. Имейте в виду, что если компилятор не хочет оптимизировать какой-либо экземпляр - он недолжен.Это будет работать в любом случае.

Могут возникнуть проблемы с шаблонами,

int f<T>() {
    T t; // how much stack should I allocate
}

, но я не уверен, что это намного хуже, чем текущая ситуация.Я на самом деле не уверен, что происходит сейчас (f<struct_of_100_bytes> отличается от f<int>?).

1 Ответ

2 голосов
/ 11 сентября 2011

Теперь представьте наследство.Или массивы.Или аргументы.Или дженерики.Или реализуя интерфейс.Или присвоение объекту / динамическому.

И имейте в виду, что среда выполнения поддерживает несколько компиляторов.

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

По сути, struct делает практически все, что вы упоминаете, и работает во всех перечисленных сценариях.Так как он обычно (для местных жителей) использует стек, он уже ведет себя так, как вы описываете.

Re вопрос "отдельная функция";во-первых, дженерики не являются «шаблонами» (это время выполнения против времени компиляции).Но генерики получают JIT для каждого типа значения и один JIT для каждого ссылочного типа (потому что действительно: макет стека изменяется.

...