Может ли встроенная переменная быть встроенной, как встроенные функции? - PullRequest
3 голосов
/ 11 октября 2019

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

Я знаю, что встроенные переменные имеют внешнюю связь и уникальный адрес, но являются ли они встроенными подобными функциями? это свойство применяется к встроенным переменным?

1 Ответ

2 голосов
/ 11 октября 2019

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

Скорее всего, это связано с тем, чтонет причин упоминать такую ​​вещь. Вы основываете свои ожидания на ложной предпосылке. Ключевое слово inline не имеет отношения к тому, может ли функция быть встроенной компилятором. Компилятор может выбрать встроенные функции, не отмеченные inline, и он может отключить встроенные функции, отмеченные inline. Это имело место с самого начала, даже когда впервые было введено ключевое слово inline.

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

, которая заменяется фактическим значением на сайте вызова.

Это невозможно сделать в целом. Вызов функции может быть заменен на содержимое функции (ее тело) компилятором, потому что компилятор знает, что такое содержимое функции. Напротив, содержимое переменной (ее значение) не известно компилятору. Это, в конце концов, часто смысл объявления переменной. Поскольку компилятор не знает «фактическое значение», у компилятора нет способа использовать это значение в качестве замены для извлечения значения из местоположения переменной в памяти.

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

...