Задать вопрос
eLBeatzzz
@eLBeatzzz

Что за странный workaround для GCC с volatile?

Здравствуйте!

Я наткнулся на фрагмент в коде старом, как... впрочем, просто в старом коде, который не могу осмыслить. Здесь используется workaround для GCC опять-таки неизвестной версии. Собственно NDA-обфусцированный код (обратите внимание на прекрасный комментарий, заботливо оставленный автором кода):
struct A
{
  int _a;
  int _b;
  A(int a, int b) : _a( a ), _b( b ) {}
};

vector<A> a_storage = fill_a_storage();
vector<size_t> a_index = get_a_index();

A get_a(size_t index)
{
#ifndef __GNUC__
  return a_storage[ a_index[index] ];
#else   // Workaround for the GCC compiler
  volatile A tmp = a_storage[ a_index[index] ];
  return A(tmp._a, tmp._b);
#endif
}


Буду бесконечно благодарен, если кто-то сможет объяснить суть этого workaround с временной volatile переменной:
#else   // Workaround for the GCC compiler
  volatile A tmp = a_storage[ a_index[index] ];
  return A(tmp._a, tmp._b);
#endif
  • Вопрос задан
  • 2551 просмотр
Подписаться 3 Оценить Комментировать
Решения вопроса 1
icelaba
@icelaba
Знаю и умею всё
Очень похоже на ситуацию тут https://bugzilla.redhat.com/show_bug.cgi?id=90131
"gcc-3.2.2 corrupts structs if several struct-copy operations are performed in
sequence"
Там по ссылкам есть еще похожие примеры, везде предложенный workaround это воткнуть запрет компилятору на reorder команд - asm("") (или asm volatile("" ::: "memory");)

Тут возможно решается та же проблема через volatile X x = y и последующее копирование структуры, автор возможно использует что то типа "A compiler cannot eliminate or reorder reads/writes to a volatile-qualified variables"
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы