对于Linux,end()的减量并不总是在C ++中起作用

时间:2019-06-03 15:28:50

标签: c++ linux memory iterator compiler-flags

在C ++,Linux中,我们有一个3元素的双向迭代器。从end()开始递减有时指向最后一个元素,但有时指向第一个元素。

在我们的项目(ARM, Linux)中,我们使用双向iterator,大多数情况下使用3个元素。访问元素时,有时我们会使用end()函数。在我们从gcc 8升级到新的gcc 4之前,该方法工作正常。使用新的编译器,我们遇到了一些奇怪的结果。最后,我发现原因是迭代器prev(end())有时指向第一个元素而不是最后一个元素。

我尝试调试的问题:

1)尝试了--itprev(it)rbegin(),它们都具有相同的行为。请注意,问题不会一直发生。但是,尽管发生了这三种方法,但结果却是相同的。它只会从end()开始递减。其他元素的递增/递减始终有效。

2)我编写了一个小型测试程序,使用相同的编译器进行了编译。这个问题永远不会发生。

3)使用较旧的编译器(gcc 4.7),在以调试模式编译项目时遇到了这个问题。我们在调试模式下采取了一些解决方法(不使用end())。现在,使用新的gcc 8.3,它甚至可以在常规构建中发生。因此,我们想深入了解问题并尝试找出问题所在。请注意,在更新到新的gcc时,我们也将Linux kernel3.0更新为4.4

我怀疑这可能与内存对齐问题有关,因为受影响的代码每秒被调用一次。行为是-它连续5秒指向第一个元素,然后连续3秒指向最后一个元素。似乎它受内存中代码执行位置的影响。

我可以尝试使用任何compiler flags设置吗?

示例代码:

#include <iostream>
#include <map>

int main(void)
{

std::map<int,int> mymap;

mymap[11] = 100;
mymap[22] = 200;
mymap[33] = 300;

std::map<int,int>::const_iterator it = mymap.end();
--it;
printf("%d ", it->first);

}

在工作时,它应该打印33。但是有时它会打印11。

0 个答案:

没有答案