адрес-из-упакованного-члена: Отключить для конкретной функции?

Я заметил, что эта ошибка возникает каждый раз, когда я обращаюсь к члену упакованной структуры.

  1. Как я могу отключить его специально для функций, которые обрабатывают смещение? (safe_unaligned_val_16/32/64 - формирует вывод, вручную беря байт за байтом, как memcpy)
  2. Делает ли GCC некоторую оптимизацию, если я передаю указатели на структуру функции? Я заметил некоторые оптимизации, например, когда у вас есть структура с 4 байтами примитивных типов, она просто передает это значение в один 32-битный регистр, когда функция не изменяет значение примитивов в. Если вы знаете что-нибудь вроде это ^

Спасибо, Грег

1 ответ

  1. Как я могу отключить его специально для функций, которые обрабатывают несоосность? (safe_unaligned_val_16/32/64 - формирует вывод, вручную беря байт за байтом, как memcpy)

В языке C не указывается ни диагностика, ни способ ее решения. У него даже нет ощущения упаковки структур, оставляя большинство деталей компоновки структур на усмотрение реализации.

Поскольку вам кажется, что вас особенно интересует GCC, вы, вероятно, обнаружите, что прагмы этой реализации, влияющие на диагностику, могут быть использованы для этой цели. В частности, вам, вероятно, будет удобно сделать

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wwhatever-the-relevant-option-is"

// function or functions ...

#pragma GCC diagnostic pop
  1. Делает ли GCC некоторую оптимизацию, если я передаю указатели на структуру функции? Я заметил некоторые оптимизации, например, когда у вас есть структура с 4 байтами примитивных типов, она просто передает это значение в один 32-битный регистр, когда функция не изменяет значение примитивов в. Если вы знаете что-нибудь вроде это ^

Я не знаю об этой конкретной оптимизации, но реализации имеют большую свободу для оптимизации. Компилятор должен гарантировать, что семантика результирующей программы эквивалентна семантике, описанной в C для представленного ему исходного кода. Такая оптимизация действительно может быть допустимой и полезной для функции, которая удовлетворяет довольно жесткому набору требований, но не изменять указанное значение недостаточно для того, чтобы такая оптимизация была безопасной.

Другие вопросы по тегам