Pull to refresh
3
1
Subscribers
Send message
Раньше си ошибочно низкоуровневым называли, теперь c#, ждём статью «низкоуровневый JavaScript»
memcpy тоже быстро копирует. В GCC вроде он не функция, а built-in
Наверное, стоит добавить, что когда матриц много, то очень часто имеет смысл сначала определить порядок умножения матриц.
У вас ошибка. strict alliasing позволяет кастовать к любому типу. Запрещено лишь разыменовывать указатель. Сам по себе cast к UB не приводит.
После того, как произошло UB компилятор может не делать «то что сказано».

Для UB достаточно чтения с 2 указателей разного типа. А откуда инфа, что только в пределах 1 функции?! Или это просто наблюдения нескольких компиляторов. Если второе, то всё плохо. Вон, люди memcpy для заполнения памяти последовательностью использовали. Везде работало, а потом раз и перестало. С UB шутки плохи, ибо оно проявляется неожиданно и может долгое время не давать о себе знать.

f и i не должны ссылаться на один и тот же блок памяти, ибо они имеют разный тип. volatile не убирает UB. А UB означает, что может произойти, что угодно.

Можете пояснить будет ли мой случай нарушать strict aliasing. Пишу абстрактный вектор на C11, чтобы можно было использовать [] структура вектора в памяти такая:
+------+----------+---------+
| size | capacity | data… |
+------+----------+---------+

Пользовательский указатель указывает на data. В ряде функций, связанных с этим вектором необходимо получить size. Для этого необходимо от переданного пользовательского указателя отнять 16 байт и считать/записать size_t. Будет ли нарушать правило strict aliasing следующий код?
((size_t *)(vec))[-2] = size;
12 ...
8

Information

Rating
Does not participate
Registered
Activity