Общий ответ на вопрос «как реализовать функцию memcpy, соответствующую строгим правилам алиасинга», выглядит примерно так:
void *memcpy(void *dest, const void *src, size_t n)
{
for (size_t i = 0; i < n; i++)
((char*)dest)[i] = ((const char*)src)[i];
return dest;
}
Однако, если я правильно понимаю, компилятор может переупорядочивать вызов memcpy и доступ к dest, потому что он может переупорядочивать записи в char* при чтении из любого другого типа указателя (строгие правила псевдонимов предотвращают только переупорядочивание чтения из char* при записи к любому другому типу указателя).
Правильно ли это, и если да, то есть ли способы правильно реализовать memcpy, или мы должны просто полагаться на встроенный memcpy?
Обратите внимание, что этот вопрос касается не только memcpy, но и любой функции десериализации/декодирования.
memcpy
как встроенную функцию и поступать правильно. Что касается того, как это работает в стандартном C, вы реализуете его с символьными типами, как вы упомянули. Все остальное будет зависеть от реализации. - person Cody Gray   schedule 31.07.2014SomeData *dest, *src; memcpy(dest, src); dest->...
- person Oleg Andreev   schedule 31.07.2014