ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Среда
24 апреля
1021094 Топик полностью
LightElf (26.07.2020 14:26, просмотров: 705) ответил fk0 на На счёт memcpy: с одной стороны да, ты можешь подсунуть невыравненный адрес и всё должно работать. И действительно, если ты руками там как-то аллоцировал память, посчитал адрес, он оказался невыравненный -- всё будет работать. Будет вызвана "неоптимальная" версия memcpy. А в случае с гудвиновским багом компилятор был обманут: ему сказали, что будеут копировать вот такой-то тип, а этот тип никак не может лежать на невыравненном адресе, следовательно, компилятор знает, если
Извини, но ты загнался. 

1) GCC имеет документированную фичу в виде упакованных структур. Иногда это полезно.

2) Библиотечная функция memcpy принимает указатели типа (void *), которые по определению никакого выравнивания не имеют.

3) Совокупность 1) и 2) ломает программу, так как в некоторых случаях GCC некорректно приводит (void *) к (int *).

Налицо баг GCC в виде чрезмерно оптимистичных предположений. Как GCC-писателям эту проблему разрулить - им виднее. Возможно стоит завести некий внутренние атрибуты типа (aligned int/unaligned int). Или наоборот, использовать оптимизацию только в случаях, когда оптимизатор однозначно видит определение переменной.

Не надо делать мне как лучше, оставьте мне как хорошо