- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
// UNALIGNED only for IA64 (Itanium)
// for AMD64 & i386 this not needed
void * c_memmove(void *dest, void const *src, size_t n)
{
void *ret = dest;
if (n)
{
(__int8 *&)dest += n;
(__int8 *&)src += n;
switch (int x = n % 4)
{
do
{
if (!!'true')
{
case 0:
*--(UNALIGNED __int32 *&)dest = *--(UNALIGNED __int32 *&)src;
n -= 4;
}
else
{
case 3:
*--(__int8 *&)dest = *--(__int8 *&)src;
case 2:
*--(__int8 *&)dest = *--(__int8 *&)src;
case 1:
*--(__int8 *&)dest = *--(__int8 *&)src;
n -= x;
}
} while (n);
}
}
return ret;
}
SadKo 18.05.2012 08:48 # +2
Но вообще в таких слуаях код для каджой архитектуры пишется свой.
63F45EF45RB65R6VR 18.05.2012 10:38 # −5
guest 18.05.2012 13:14 # +4
absolut 18.05.2012 13:59 # 0
63F45EF45RB65R6VR 18.05.2012 15:02 # −1
defecate-plusplus 18.05.2012 15:30 # +2
http://govnokod.ru/8495#comment119288
SadKo 19.05.2012 00:37 # 0
А тут чисто копирование в обратном порядке. Этакий недоделанный memmove.
guest 19.05.2012 01:16 # +3
defecate-plusplus 18.05.2012 09:21 # +2
roman-kashitsyn 18.05.2012 09:31 # 0
TarasB 18.05.2012 10:51 # 0
guest 18.05.2012 11:03 # 0
HaskellGovno 18.05.2012 20:04 # 0
TheCalligrapher 19.05.2012 20:07 # +2
Понятно, что каждый С/С++ программист обязан хотя бы раз в своей жизни применить Duff's device. Ничего зазорного в этом нет. Но что делает Duff's device здесь?
Цель Duff's device, как известно, заключается в элегантной реализации обработки "остатка" при выполнении развертки цикла. Основная идея Duff Device - использование одного и того же кода как для обработки основной итерации так и для обработки "остатка" (засчет входа в середину развернутого кода).
В данном же случае никакой развертки цикла не делается: во время выполнения основной итерации цикла работает отдельная ветка 'case 0:', т.е. за каждую итерацию цикла выполняется одно и только одно присваивание (пусть и "большое", т.е. 32-битное).
Да, засчет Duff's Device тут выполняется вход в середину кода обработки "остатка", т.е. какие-то следы идеи Duff's Device прослеживаются, но это не более чем дискредитация идеи. Оно тут служит лишь запутыванию кода и все.
Я думаю, что к такому виду этот код пришел в результате эволюционных изменений. Скорее всего, изначально тут был реализован (или хотя бы задуман) классический полноценный Duff's Device с разверткой цикла и побайтовым копированием. Потом кто-то решил его соптимизировать, заменив основную итерацию на 32-битное копирование. Это здравая оптимизация. Но вот то, что Duff's Device в этом оптимизированном варианте стал ни на фиг не нужен аффтар не заметил.
Отдельно стоит заметить, что оптимизация хоть и здравая (по идее), но реализована неправильно. На любой платформе, что с жесткими требованиями выравнивания, что с мягкими, оптимизация через многобайтное копирование дает хороший эффект только при копировании выровненных данных. Вот к этому и надо было стремиться.
Удивляет также использование 'if(!!'true')'. Это еще что такое? Milti-characher char literal?? Зачем??? Почему бы просто не написать 'if(true)'?
TheCalligrapher 22.05.2012 19:50 # 0
rat4 22.05.2012 20:21 # 0
An ordinary character literal that contains more than one c-char is a multicharacter literal. A multicharacter literal has type int and implementation-defined value.
То есть 'true' - это int и значение зависит от компилятора.
!! преобразует int в bool
Возможно, пытались надурить глупый компилятор, или просто говно :-)
TheCalligrapher 22.05.2012 20:27 # 0
absolut 22.05.2012 22:04 # 0
guest 24.02.2017 05:07 # 0
<a href=http://mirurokov.net/page/83/>мастер класс селезнев куриные котлеты</a>