Гарантируется ли эта функция встроенной - PullRequest
0 голосов
/ 31 марта 2011

Я просматривал какой-то код на работе и нашел это

inline
  FLAGS get_flags(void) {
  FLAGS res;
  memset(&res, 0, sizeof(res));
  return res
}

Это объявлено в заголовочном файле, включенном в программу.Я понимаю, что было бы очень плохо, если бы он не был встроен, поскольку он размещен в стеке.У нас никогда не было проблем с рассматриваемым кодом, но мне было просто интересно.

Ответы [ 6 ]

6 голосов
/ 31 марта 2011

Нет, расширение не гарантируется.inline - просто подсказка компилятору.

Тем не менее, хотя res действительно существует в стеке, вы возвращаете его копию .Это не будет «очень плохо», если встроенное расширение не произойдет.

2 голосов
/ 31 марта 2011

inline имеет две цели, но больше не имеет значения только одна.

Как уже говорили другие, цель подсказки компилятору о том, что функция должна быть встроена, практически бесполезна.Компилятор гораздо лучше определяет, что должно быть встроено, чем программист.

Однако, второе важное применение (которое применяет в вашем случае) состоит в том, что он нарушает правило одного определения (УСО).То есть, при нормальных обстоятельствах компоновщик не должен принимать видение символа, определенного более одного раза.Однако, если этот символ был объявлен inline, он может предположить, что определение каждого из них одинаково, а остальные игнорировать.

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

2 голосов
/ 31 марта 2011

Нет, не гарантируется, что компилятор его встроит.См. этот ответ .

Как говорит Струсуп на языке программирования C ++

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

Обратите внимание на ключевое слово подсказка .

0 голосов
/ 31 марта 2011

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

0 голосов
/ 31 марта 2011

Поведение функции по отношению к переменным, «размещенным в стеке», не изменяется независимо от того, встроено оно или нет.Таким образом, независимо от того, какие у вас проблемы со стеком, они одинаково действительны (или недействительны) в любом случае.

0 голосов
/ 31 марта 2011

Компилятору разрешено игнорировать ключевое слово inline. Если это очень плохо, чтобы не inline это, то вы должны использовать макрос #define или создать класс с подходящим конструктором (поскольку вы пометили это как C ++) и т. Д.

...