ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
17 мая
1020758 Топик полностью
RxTx (24.07.2020 22:30, просмотров: 703) ответил 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.

Спасибо, князь. Вы настоящий дворянин. И программист.