[devel] memcpy глючит (или я не умею его готовить)

Leonid Krivoshein klark.devel на gmail.com
Сб Фев 23 01:48:30 MSK 2019


22.02.2019 23:51, Vladimir Didenko пишет:
> пт, 22 февр. 2019 г. в 22:29, Leonid Krivoshein:
>> 21.02.2019 16:25, Alexey V. Vissarionov пишет:
>>> (_data.size % 2) лично я поменял бы на (_data.size & 0x01)
>> Да, так на порядок быстрее.
> Это одинаково. Не надо оптимизировать за компилятор, он с этим и сам
> неплохо справляется (иногда, даже чересчур)

Это может быть одинаково при соблюдении многих "если". А может и не 
быть. Лучше писать сразу без надежд на "если".


>> Тут ко всему не очевидное поведение компилятора при работе с адресами,
>> когда их складывают с целыми (много от чего зависит и в ряде случаев
>> просто на ворнинги можно нарваться). Такой код в любом случае сразу
>> переписывать на более безопасный, независимо от memcpy()/memmove().
>> Например, так:
>>
>> memmove(&_data.data[8], &data.data[9], _data.size - 9); /* если тип
>> данных [unsigned] char */
>>
> Вы глупость написали. Арифметика указателей и целых чисел вполне
> определена и безопасна, если не выходить за границы массива. И еще -
> запись p + 8 и &p[8] равносильны согласно стандарту языка C.

И каково же её определение в разных стандартах языка C? А реализация в 
разных компиляторах? К примеру, согласно N1570 (6.5.6) над 
void-указателями такого не проделаешь, в отличие от gcc, который тоже ни 
один стандарт могёт. Кстати, именно с такой арифметикой на более старом 
gcc на ворнинги нарывался и всегда их сразу выправлял. Нет, лучше об 
этом не думать, а писать сразу так, чтобы работало везде.


-- 
Best regards,
Leonid Krivoshein.



Подробная информация о списке рассылки Devel