【发布时间】:2011-01-29 03:08:04
【问题描述】:
我有一个正在处理的程序,我正在从使用数组切换到向量,但是我遇到了一个问题。我已将其简化为:
#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,Ubuntu 10.04 x86_64 上的版本 4.4.3 (Ubuntu 4.4.3-4ubuntu5)):
/usr/include/c++/4.4/bits/stl_construct.h:在析构函数“A::~A()”中: /usr/include/c++/4.4/bits/stl_construct.h:92:警告:无法优化循环,循环计数器可能溢出
那么,Leo,什么给了?向量类不应该跟踪它有多少元素吗?那么,如果那是被引用的“计数器”,它怎么会溢出呢? (编辑:这个问题或多或少在下面得到了回答,但是,对我来说,只留下了推论:为什么要警告库中的循环无法优化?为什么我应该,最终用户,会担心吗?)
编辑:
这是被投诉的相关代码(但是,正如我在 cmets 中所说,我不明白为什么应该考虑我,因为我不需要担心库的实现):
/**
* 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);
}
};
更新:
好的,我期待两个答案之一:我在 my 代码中做了一些微妙的异常(但不一定是错误的),或者该消息非常字面上告诉我循环在库中指出无法优化。感激地放心,它不是前者,是从它自己的库中报告警告预期来自 gcc 的行为,还是应该报告? (似乎不值得再提出一个问题来问这个问题,所以请原谅这个新问题。)
更新 2:
好的,感谢所有信息人员:那么这是编译器中的一个错误。仅供参考,我从 GNU(版本 4.5.2)编译了一个不受干扰的编译器和 c++ 库,它不显示这种行为(库代码是相同的),所以我想这样的警告不应该出现。再次感谢大家。
【问题讨论】:
-
: a()在构造函数中的作用是什么?如果删除它有什么变化吗? -
好吧,我想它可能会让学究远离! (除非我弄错了,我很可能是......)不,当我删除它时仍然是同样的警告。
-
你真的需要使用-Wunsafe-loop-optimizations吗?旧的 --funroll-loops 对您来说还不够好吗?为什么没有-O3?
-
@Zorawar: 如果您在这里复制
/bits/stl_construct.h中的内容并标识92行(注意,仅复制所涉及的函数就足够了,无需粘贴整个标题)。这是我的一个小障碍:我不是千里眼。 -
@Matthieu:嗯,这就是我真正要问的问题:gcc 是在抱怨我的代码还是 GNU 的代码?我不必粘贴 bits/stl_construct.h 中的内容,因为我永远不必担心里面有什么。不过,我会添加它以防万一我很愚蠢。
标签: c++ optimization gcc stl vector