как проверить, что произошло встраивание - PullRequest
3 голосов
/ 19 мая 2011

Я бы хотел массово использовать inline в своем проекте для повышения производительности.

Насколько я знаю, компилятор может применять встроенный или нет;это зависит от компилятора.

Мне не ясно, что я могу сделать, чтобы сделать это возможным, но, прежде чем идти в этом направлении, знаете ли вы способ проверить, действительно ли происходило встраивание или нет в выходных данныхдвоичная?

Ответы [ 5 ]

7 голосов
/ 19 мая 2011

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

7 голосов
/ 19 мая 2011

Используйте gcc -Winline для получения предупреждений, когда встроенная функция не встроена.

Используйте __attribute__ ((always_inline)) для принудительного включения функций.

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

6 голосов
/ 19 мая 2011

Используйте параметр gcc -S, чтобы сгенерировать вывод ассемблера, а затем проверить вывод в вашем любимом текстовом редакторе.

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

1 голос
/ 19 мая 2011

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

static int foo(int x)
{
  return(x*x);
}

main()
{
  int x=1;
  foo(x);
}

Для проверки

not seth> gcc -o /tmp/foo /tmp/main1.c
not seth> nm /tmp/foo | grep foo
00000000004004c4 t foo
not seth> gcc -O -o /tmp/foo /tmp/main1.c
not seth> nm /tmp/foo | grep foo
0 голосов
/ 19 мая 2011

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

Фактически, даже если одна вызываемая функция находится в другом модуле перевода, умный компоновщик может встроить его во время соединения (MSVC предоставляет эту функцию как «генерацию временного кода связи»).Это требует тесного сотрудничества между компилятором и компоновщиком.

raison d'être ключевого слова inline позволяет функциям [non template] нарушать правило единого определения,и, таким образом, должны быть определены в заголовочных файлах.Фактическое встраивание функции будет определяться компилятором на основе различных эвристических и оптимизационных флагов, переданных ей, и , а не на основе ключевого слова inline.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...