Подтвердить что ты не робот

Возможно ли, чтобы функция не была встроена?

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

4b9b3361

Ответ 1

В Visual Studio 2010 __declspec(noinline) указывает компилятору никогда не встраивать определенную функцию-член, например:

class X {
     __declspec(noinline) int member_func() {
          return 0; 
     }
};

edit: Кроме того, при компиляции с /clr функции с атрибутами безопасности никогда не встраиваются (опять же, это относится к VS 2010).

Я не думаю, что это вообще будет полезно при отладке.

Ответ 2

__declspec(noinline) для VС++. В отличие от справочной страницы, это работает для автономных функций, и я не думаю, что когда-либо использовал его для функции-члена. Вы можете - хотя помните, что у меня никогда не было - хотите также играть с флагами оптимизации, так что для вложения рассматриваются только функции inline, хотя, конечно, это имеет глобальный эффект, и это может быть не то, что вы хотите.

__attribute__((noinline)) для gcc (и нескольких менее распространенных компиляторов, поддерживающих синтаксис атрибута gcc). Должен признаться, я не думаю, что когда-либо использовал это, но, похоже, он там.

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

Я не уверен, как любой из них взаимодействует с ключевым словом inline С++; Я использовал их только при отладке (когда я просто хочу, чтобы какая-то некоторая встроенная функция оставалась не встроенной после оптимизации) или при анализе сгенерированного кода (и я сбиваюсь с толку, потому что случайный материал встраивается).

Ответ 3

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

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

Чтобы сайт вызова не был встроен, вы можете использовать указатель на функцию.

void (*f_ptr)(int); // pointer to function
volatile bool useMe = true; // disallow optimizations 
if (useMe)
   f_ptr = myFunc;
else
   f_ptr = useOtherFunc;

f_ptr(42); // this will not be inlined

Ответ 4

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

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

Ответ 5

Многие компиляторы могут выполнять сквозную трансляцию. Visual Studio имеет это в течение пяти лет, и я считаю, что GCC теперь может это сделать, особенно после OP, отмеченного как Visual С++, это справедливая ставка, что его компилятор может справиться.

Самый простой способ сделать это - принять адрес функции, а затем сделать что-то не бессмысленное с ним, например, вызвать его или передать его функции OS/external library. Компилятор не может встроить такую ​​функцию.

Зачем вам это нужно, IDK.

@comments:

Если OP srsly, srsly нужно это, тогда он мог бы скомпилировать его как lib и статически связать с ним.

Ответ 6

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

Ответ 7

Если это функция-член класса, сделайте ее виртуальной.

Ответ 8

Возможно ли, чтобы функция не была встроена?

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

Вложение в основном

  • оптимизация, которая в основном прозрачна для вас
  • способ разрешить определение функций в заголовках без ошибок определения количества файлов

(Некоторые переключали бы порядок этих двух, но я придерживаюсь традиционного порядка.)

Если не указано A), вам абсолютно необходимо определить функцию в каком-либо заголовке или B). профилировать и оптимизировать кусок кода и лучше знать, чем компилятор, что должно быть встроено, а что нет, вложение не должно вас беспокоить.
Это отнюдь не должно быть проблемой из-за отладки. Ваш отладчик должен (и в случае с VC также) позаботиться об этом для вас.