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

подсунет тебе оптимизированную функцию, то всё будет точно так же -- следовательно оптимизация возможна. Проблема в том, что у тебя на самом деле тип -- другой, не int. И ты код вызывающий такой сбой, в рамках стандартного C/C++ -- никак не напишешь, у тебя невозможно размещение существующих объектов любого типа по адресам с не соответствующим alignof(type). Поэтому я и говорю, что упакованные структуры -- грязный хак с массой побочных багов, и их не нужно использовать. Сама концепция -- не продуманная, не вписывающаяся в существующую модель вычислительной машины в которой работают языки C/C++. Потому, что в этой модели не может, не бывает, такого, чтоб какой-либо объект в памяти лежал на адресе не соответствующем alignof(type). Если хочется более полноценно работать с упакованными структурами, то это можно сделать, но сама концепция "упакованных структур" не нужна. Достаточно создать новые типы со своим, другим, alignas и они самоупакуются прекрасно в обычную структуру. Но на C ты такой код не напишешь, только на C++. Кроме того, при создании такого типа ты внутрь его тот же самый int, разумеется, в принципе не сможешь положить. Придётся ручками эмулировать int из набора char'ов. Но всё получится. И даже компилятор сгенерирует сам правильный код, где будет куча ldrb при обращении к такой переменной:

https://godbolt.org/z/fceMEx
[ZX]