У меня есть программа, над которой я работаю, где я переключаюсь с использования массивов на векторы, но у меня возникает проблема.Я сократил его до этого:
#include <vector>
class A {
public:
A(void);
~A(void);
private:
std::vector< std::vector<int> > a;
};
A::A(void) : a() {}
A::~A(void) {}
Это дает следующее предупреждение от g ++ (флаги: -O2 -Wunsafe-loop-optimizations, версия 4.4.3 (Ubuntu 4.4.3-4ubuntu5) наUbuntu 10.04 x86_64):
/usr/include/c++/4.4/bits/stl_construct.h: в деструкторе 'A :: ~ A ()': /usr/include/c++/4.4/bits / stl_construct.h: 92: предупреждение: невозможно оптимизировать цикл, счетчик цикла может переполниться
Итак, что дает Лео?Разве векторный класс не должен отслеживать, сколько у него элементов?Итак, если это «счетчик», на который ссылаются, как он может переполниться?( Редактировать : на этот вопрос более или менее дан ответ ниже, но, на мой взгляд, остается только следствие: зачем беспокоиться о том, что цикл в библиотеке не может быть оптимизирован?пользователь, беспокоиться об этом?)
Редактировать :
Вот соответствующий код жалобы (но, как я уже сказал в комментариях, я непонимаю, почему это должно быть моим соображением, поскольку мне не нужно беспокоиться о реализации библиотеки):
/**
* Destroy the object pointed to by a pointer type.
*/
template<typename _Tp>
inline void
_Destroy(_Tp* __pointer)
{ __pointer->~_Tp(); }
template<bool>
struct _Destroy_aux
{
template<typename _ForwardIterator>
static void
__destroy(_ForwardIterator __first, _ForwardIterator __last)
{
for (; __first != __last; ++__first) // <-- this is line 92
std::_Destroy(&*__first);
}
};
Обновление :
ОК,Я ожидал одного из двух ответов: что я делал что-то немного ненормальное (но не обязательно неправильное) в моем коде, или что сообщение очень буквально сообщало мне, что цикл, указанный в библиотеке, можетне быть оптимизированным.С благодарностью заверил, что это не первый случай, сообщает ли GCC о предупреждениях из своей собственной библиотеки об ожидаемом поведении, или об этом следует сообщать?(Похоже, не стоит открывать еще один вопрос, чтобы задать этот вопрос, извините за новый вопрос.)
Обновление 2 :
ОК, спасибо за информацию, ребята:это ошибка в компиляторе.Просто для справки, я скомпилировал unmoled компилятор и библиотеку c ++ из GNU (версия 4.5.2), которая не отображает это поведение (код библиотеки идентичен), поэтому я предполагаю, что подобные предупреждения не должны появляться.Еще раз спасибо всем.