Оберон-клуб «ВЄДАsoft»

Твердыня модульных языков
Текущее время: 23 ноя 2017, 18:55

Часовой пояс: UTC + 2 часа




Начать новую тему Ответить на тему  [ Сообщений: 26 ]  На страницу Пред.  1, 2, 3  След.
Автор Сообщение
СообщениеДобавлено: 25 янв 2016, 18:50 
Не в сети
Аватара пользователя

Сообщения: 843
Откуда: Днепропетровская обл.
enemy писал(а):
так SDCC так и делает, вместо memcpy вставляет
...
А вот не всегда SDCC так делает. См. такой код:
Код: "C"
#define __COPYREC(d, s, n) memcpy((char*)(d),(char*)(s),n)
 
typedef
struct AsgnRec_Card { int suit, rank; } AsgnRec_Card;
 
static AsgnRec_Card AsgnRec_a, AsgnRec_b;
 
void main (void) {
__COPYREC(AsgnRec_a, AsgnRec_b, 4);
return;
}
Код: "ASM"
; Function main
; ---------------------------------
_main::
call ___sdcc_enter_ix
;AsgnRec.c:36: __COPYREC(AsgnRec_a, AsgnRec_b, 4);
ld de,#_AsgnRec_b
ld hl,#_AsgnRec_a
ld bc,#0x0004
push bc
push de
push hl
call _memcpy
pop af
pop af
pop af
;AsgnRec.c:37: return;
pop ix
ret


Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 25 янв 2016, 22:36 
Не в сети

Сообщения: 20
4 байта дороже копировать ldir проще через регистры, 8 байт уже ldir


Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 26 янв 2016, 23:34 
Не в сети

Сообщения: 20
вообще структуры нельзя копировать memcpy, размещение их в памяти целиком на совести компилятора


Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 28 янв 2016, 10:39 
Не в сети
Аватара пользователя

Сообщения: 843
Откуда: Днепропетровская обл.
enemy писал(а):
4 байта дороже копировать ldir проще через регистры, 8 байт уже ldir
Это понятно, но SDCC так не делает.

enemy писал(а):
вообще структуры нельзя копировать memcpy, размещение их в памяти целиком на совести компилятора
Сколько видел сишного кода в жизни — часто так копируют. Какие конкретно недостатки, кроме личных предпочтений?


Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 28 янв 2016, 18:32 
Не в сети

Сообщения: 26
Zorko писал(а):
enemy писал(а):
вообще структуры нельзя копировать memcpy, размещение их в памяти целиком на совести компилятора
Сколько видел сишного кода в жизни — часто так копируют. Какие конкретно недостатки, кроме личных предпочтений?


Размещение сишных структур в памяти довольно строго регламентировано, так что memcpy должно работать всегда. "Недостатки" и масса багов начинаются в С++, где "правильное" использование memcpy жестко ограничено структурами с POD полями. Так что в С++ рекомендуется вообще никогда не использовать memcpy, чем думать когда оно может сработать неправильно. Тем более, что запись "record1 = record2" воспринимается более естественно, чем memcpy, а работает всегда.


Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 29 янв 2016, 05:50 
Не в сети
Аватара пользователя

Сообщения: 843
Откуда: Днепропетровская обл.
vlad писал(а):
запись "record1 = record2" воспринимается более естественно, чем memcpy, а работает всегда.
Всё верно, но только не в SDCC, — почему, собственно, и возникла эта тема. Разработчики в курсе проблемы и собираются её исправить, но это длится уже долгое время.

2Saferoll: Олежек, есть мысль отказаться от опции "SDCC support". Ведь можно объявлять макрос для SDCC так:
Код: "C"
#define __COPYREC(d, s, n) memcpy((char*)(d),(char*)(s),n)
А для остальных компиляторов так:
Код: "C"
#define __COPYREC(d, s, n) d=s

Закоммитил


Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 29 янв 2016, 20:11 
Не в сети

Сообщения: 20
Про memcpy для структур для Си, согласен, погорячился. Offset полей формируется в момент описания типа и копировать структуры одного и того же типа, между собой безопасно.
Нужно просто помнить о переносимости, копирование в массив, может иметь разный результат в разных компиляторах и разных платформах.
packed это отдельная тема, тут вопрос о применимости может стать из за производительности


Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 30 янв 2016, 13:34 
Не в сети
Аватара пользователя

Сообщения: 843
Откуда: Днепропетровская обл.
Кстати, часто также обнуляют поля структур с помощью memset, это классический для Си способ обнулить всё и сразу.

Добавлю, что Оберон-транслятор в Си Ofront не допускает присваиваний между записями разных типов, не говоря уж о записях разного размера.

Мне не совсем понятно как при копировании указателей (полей записи) справляется со своей задачей сборщик мусора, но ведь работает.


Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 30 янв 2016, 18:05 
Не в сети

Сообщения: 26
Zorko писал(а):
Кстати, часто также обнуляют поля структур с помощью memset, это классический для Си способ обнулить всё и сразу.


Не знаю как в современном C, но в C++ есть более короткий и естественный способ:
Код: "OBERON"
  1.  
  2. record r = {}; // обнуляет все поля, точнее инициализирует значениями по умолчанию
  3.  


Zorko писал(а):
Мне не совсем понятно как при копировании указателей (полей записи) справляется со своей задачей сборщик мусора, но ведь работает.



Консервативному GC все равно...


Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 31 янв 2016, 08:42 
Не в сети
Аватара пользователя

Сообщения: 843
Откуда: Днепропетровская обл.
Это ведь Си. И сборщику надо как-то дать знать, что это отслеживаемый указатель, а не простой. Впрочем, там генерируется вызов функции EnumPtrs для указателей, они обнуляются, наверное как-то так попадают и во внутренние структуры сборщика.
Код: "C"
static void EnumPtrs(void (*P)(void*))
{
P(Clock_Instance);
P(Clock_hbrForegnd);
P(Clock_hbrBackgnd);
P(Clock_hpenForegnd);
P(Clock_hpenBackgnd);
P(Clock_Wnd);
P(Clock_Menu);
P(Clock_pszTooMany);
...
export main(int argc, char **argv)
{
__INIT(argc, argv);
...
__REGMAIN("Clock", EnumPtrs);


Вернуться к началу
 Профиль  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 26 ]  На страницу Пред.  1, 2, 3  След.

Часовой пояс: UTC + 2 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group
Тех.поддержка phpBB