Подставляемые функции C++ с помощью GCC - почему ВЫЗОВ?

Вы можете использовать назначенные инициализаторы для инициализации элементов elems[] без необходимости знать явное значение каждого индекса индекса (или макроса).

const MyElements elems[] = {
    [TOTO_IND] = {"TOTO", 18, "French"},
    [TITI_IND] = {"TITI", 27, "English"},
    [TATA_IND] = {"TATA", 45, "Spanish"},
};

Элементы массива будут инициализированы таким же образом, даже если вы измените порядок их появления в исходном коде:

const MyElements elems[] = {
    [TITI_IND] = {"TITI", 27, "English"},
    [TATA_IND] = {"TATA", 45, "Spanish"},
    [TOTO_IND] = {"TOTO", 18, "French"},
};

Если длина массива устанавливается автоматически из инициализатора, как указано выше (т.е. используя [], а не [NUM_ELEMS]), тогда длина будет на единицу больше, чем максимальный индекс элемента.

Это позволяет вам сохранить значения индекса и внешнюю декларацию массива elems в файле .h, а также определить содержимое массива elems в отдельном файле .c.

17
задан Glorfindel 19 March 2019 в 11:01
поделиться

7 ответов

Не существует универсального способа C ++ ПРИНУДИТЬ компилятор для создания встроенных функций. Обратите внимание на слово «подсказка» в процитированном вами тексте - компилятор не обязан вас слушать.

Если вам действительно абсолютно необходимо сделать что-то встроенным, вам понадобится ключевое слово, специфичное для компилятора, ИЛИ вы вам нужно будет использовать макросы вместо функций.

23
ответ дан 30 November 2019 в 09:59
поделиться

Как упоминал Майкл Кон, ключевое слово inline всегда является подсказкой, и GCC в случае вашей функции решил не встраивать его.

Поскольку вы используете Gcc, вы можете принудительно встроить его с помощью __attribute ((always_inline)).

Пример:

 /* Prototype.  */
 inline void foo (const char) __attribute__((always_inline));

Источник: Встроенные документы GCC

48
ответ дан 30 November 2019 в 09:59
поделиться

Вы смотрите отладочную сборку (оптимизация отключена)? Компиляторы обычно отключают встраивание в «отладочные» сборки, потому что они усложняют отладку.

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

  • Компилятор может быть простым и не поддерживать встраивание
  • Компилятор может использовать внутренний алгоритм, чтобы решить, что встраивать, и игнорировать подсказки .
    (иногда компилятор может сделать лучше, чем вы, при выборе того, что встраивать, особенно в сложных архитектурах, таких как IA64)
  • Компилятор может использовать свои собственные эвристики, чтобы решить, что, несмотря на подсказку, встраивание не улучшит производительность
8
ответ дан 30 November 2019 в 09:59
поделиться

Это подсказка, и компилятор может игнорировать подсказку. Я думаю, что читал кое-где, что GCC обычно игнорирует это. Я помню, что слышал, что есть флаг, но он все равно не работает в 100% случаев. (Ссылку пока не нашел.)

Флаг: -finline-functions включен на уровне оптимизации -O3.

3
ответ дан 30 November 2019 в 09:59
поделиться

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

Кроме того, я заметил, что вы выполняете отладочную сборку. На самом деле я не знаю, но возможно, что компилятор отключит встраивание для отладочных сборок, потому что это усложняет работу отладчика ...

4
ответ дан 30 November 2019 в 09:59
поделиться

Независимо от того, вставлять ли в строку, зависит от компилятора. Можно ли игнорировать подсказку inline ?

0
ответ дан 30 November 2019 в 09:59
поделиться

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

0
ответ дан 30 November 2019 в 09:59
поделиться
Другие вопросы по тегам:

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