- 1
- 2
- 3
- 4
- 5
- 6
private byte Summ(byte a, byte b, byte p)
{
return Or(Or(Or(And(p, Not(a)), And(p, Not(b))), Or(And(b, Not(a)), And(b, Not(a))))Or(And(a, Not(b)),And(a, Not(p))), ()) ;//тут я и сломался
}
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+134
private byte Summ(byte a, byte b, byte p)
{
return Or(Or(Or(And(p, Not(a)), And(p, Not(b))), Or(And(b, Not(a)), And(b, Not(a))))Or(And(a, Not(b)),And(a, Not(p))), ()) ;//тут я и сломался
}
Жуткая переголова.
Хотя я читал что например ghc может упаковать такой возврат в один регистр.
> a, b, p - это не байты, а биты?
p - точно флаг переноса. А так можно и по 32 бита складывать.рекурсивно
Если этот Summ заинлайнится в цикл из которого его будут вызывать, и компилятор додумается выкинуть Tuple, заменив его парой локальных переменных - переголовы не будет...
P.S. Ну и кого волнует черезголова в проге, демонстрирующей принципы работы сумматора с последовательным переносом? :)
В сишарпе компилятор ничего не выкинет, это не кресты.
Насчёт оптимизации и аллокации CLR на стеке точно не знаю, но и сильно в этом сомневаюсь.
Кортеж - это объект, а не структура. Зачем тогда вообще struct и stackalloc в язык пилить?
Чего ж мне не верить? Я видел много чудес сотворённых джитом, например инлайн виртуальных методом.
>разворачивает классы в набор полей на стеке (это только с 4.0).
Тогда зачем тогда вообще struct и stackalloc в язык пилить?