Встроенное предупреждение G++

Вот некоторый встроенный код, вызывающий предупреждение при использовании G++ (GCC) версии 4.3.3. Я получаю эту проблему только в этой (4.3.3) более старой версии GCC на машине ARM. На машине x86 с GCC 4.5.2 этой проблемы не существует. К сожалению, в настоящее время я не могу обновить машину ARM, но мне интересно, следует ли мне беспокоиться о следующей ошибке...

// myclass.h
class MyClass {
 public:
  MyClass();
  ~MyClass() { Cleanup(); }
  void Cleanup();
};
inline void MyClass::Cleanup() {
  // do some minor cleanup here, GCC DOES inline this function
  // with -Winline, I see that no non-inline warnings are thrown
}

Проблема в том, что я получаю предупреждение: "void MyClass::Cleanup() использовался до того, как он был объявлен встроенным"

Является ли это предупреждением, которым я должен остерегаться? Я всегда встраивал только в определение функции, по существу следуя этому (http://www.parashift.com/c++-faq/where-to-put-inline-keyword.html) "лучшая практика".

Заранее спасибо за помощь.


person It'sPete    schedule 01.11.2013    source источник
comment
Если вы намеревались реализовать MyClass член Cleanup(), вы можете использовать имя класса для разрешения встроенного. inline void MyClass::Cleanup() имеет гораздо больше шансов стать тем, для кого вы, вероятно, стремитесь.   -  person WhozCraig    schedule 01.11.2013
comment
Ой, забыл, это на самом деле в коде, но забыл поместить это в свой вопрос... см. редактирование выше.   -  person It'sPete    schedule 01.11.2013
comment
... вот почему всегда полезно публиковать настоящий код.   -  person WhozCraig    schedule 01.11.2013
comment
... именно так вас увольняют за нарушение NDA и тому подобное. Кроме того, приведенный выше код является простым воспроизводимым примером ошибки. Конечно, я забыл кое-что незначительное, но дайте мне передохнуть, это был ДОЛГИЙ день.   -  person It'sPete    schedule 01.11.2013
comment
Кто сказал что-нибудь о размещении настоящего, защищенного, копируемого кода? Вы сами сказали: приведенное выше — простой воспроизводимый пример. Значит, это было не то, что вы хотели... потому что это было слишком просто? Дайте мне перерыв. Публикация правильного концептуального кода может быть скучной, как и реакция на неправильный концептуальный код только для того, чтобы обнаружить, что то, что вы считали проблемой, на самом деле не было. Это один раз для вас; мы видим это буквально сто раз в день. Так что простите меня, если я прошу внимания, необходимого, чтобы избежать этого. Прошу прощения за ваш долгий день, мой не был короче, в этом я могу гарантировать.   -  person WhozCraig    schedule 01.11.2013
comment
Код, который вы разместили, изначально даже не скомпилировался (см. Мое первое редактирование), а затем все еще не делал того, что вы имели в виду (до вашего редактирования), поэтому он воспроизводил милую FA! Вы должны были по крайней мере попытаться скомпилировать то, что вы опубликовали. Если вы собираетесь попросить десятки или сотни людей посмотреть на ваш вопрос, вы должны приложить усилия, чтобы ответить на вопрос правильно! Это означает размещение соответствующего кода. (Даже сейчас вы исправили это, я все еще не могу воспроизвести предупреждение с GCC 4.3.2)   -  person Jonathan Wakely    schedule 01.11.2013
comment
Вы компилируете с -O2, в противном случае я думаю, что встраивание ключевых слов в основном игнорируется.   -  person It'sPete    schedule 01.11.2013


Ответы (1)


Код действителен, и поэтому предупреждение от старого G++ является поддельным.

Хотя не знаю, стоит ли вам беспокоиться. Возможно, G++ делает что-то странное, основываясь на своем ложном убеждении, что в коде есть проблема, но я сомневаюсь в этом - вероятно, он работает так, как ожидалось, и просто выдает ложное предупреждение. Он может не встроить его в деструктор, но это, вероятно, не имеет большого значения, и -Winline, похоже, показывает, что в любом случае это не так.

person Jonathan Wakely    schedule 01.11.2013
comment
Поскольку ключевое слово inline действует исключительно как подсказка, в худшем случае G++ не видит подсказку и использует пониженную эвристику для встраивания. Я не знаю о G++, но clang увеличивает максимальный размер функции для встраивания на 50%, если функция inline. Если встраивание жизненно важно, вы можете использовать расширение компилятора. G++ 4.3.3 поддерживает __attribute__((always_inline)), что гарантирует встраивание. - person Sam Cristall; 01.11.2013
comment
Это не исключительно подсказка, это также позволяет определять функции в нескольких единицах перевода (без множественных ошибок определения) и некоторых других семантических эффектах. Это только намек на встраивание оптимизатором, это правда. - person Jonathan Wakely; 01.11.2013
comment
Извините, я имел в виду вывод оптимизатора, я должен был быть более ясным. - person Sam Cristall; 01.11.2013