ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Четверг
28 марта
1020758 Топик полностью
RxTx (24.07.2020 22:30, просмотров: 691) ответил fk0 на Баг в GCC, а не в Clang и вообще совершенно про противоположное, мол нет оптимизации. Остального не понял -- научись выражать мысли на понятном языке. Гудвин не прав, т.к. при использовании стандартных же любых конструкций языка (без упакованных структур) "баг" воспроизвести невозможно. А то, что он воспроизводится при использовании упакованных структур совершенно естесственно, и кстати в баге gcc есть на это комментарий (см. ссылку) -- вот так проблему можно обойти. Какие
Давай укоротим проблему, насколько это возможно, т.к. нет времени и я устал. С GCC и багом вряд ли я был прав, несмотря на то что внутри armcc.exe v4 v5 масса строк "GCC" и отсутствует "CLANG", armcc это отдельный компилятор. В v6 он называется armclang. Со стандартом вышло смешно. Формально ты привел действительно ровно то, что я спросил. И бессмысленно утверждать что разумеется вопрос был о прямых виновниках разговора: о функции memcpy (она оговорена в стандарте) и о 6.2 

.5 п.26. Не стоит лить воду, объясняя по десятому разу широкоизвестные вещи о наличии доп. атрибутов у объектов языка и компилятора, о работе кодогенератора и даже привлекая сюда C++. Надо писать о проблеме топикстартера. Напиши что ты конкретно утверждаешь (например почему выбирается такая версия функции и почему возникает unaligned access), поскольку из-за невыясненных исходно посылок можно вообще не понять друг друга и даже утверждать то же самое.


Я со своей стороны утверждаю следующее: что совершенно неважно, используется ли упаковка структур или нет, и integral-типа член структуры находящийся по невыровненному адресу не должен вызывать unaligned access именно при вызове memcpy(). При простом обращении к нему по указателю (этого же типа) - должен. А вот при typecast к void* и memcpy() - не должен ни при каких условиях. Буду рад выслушать без воды и без хамства.


Про "обход проблемы" там ясно сказано про memcpy(), что это портабельно и как она должна работать.


Of course that's not portable.

Portable is to use memcpy which irrespective of the type of the
pointer has to assume an unaligned access.