STL Map.使用VS2010在调试和发布方面的表现不同
stl map.find perform differently in debug and release using vs2010
我正在使用stl映射存储从PCAP文件中提取的流程信息。当数据包到来时,我使用map.act。查找数据包属于的流程是否存在。我必须使用映射。从a到b的数据包,从b到a的数据包属于同一流。
struct FiveTuple
{
unsigned short source_port;
unsigned short dest_port;
unsigned int source_ip_addr;
unsigned int dest_ip_addr;
unsigned char transport_proto_type;
};
fivetuple识别流动。我使用fivetuple作为地图中的关键元素。
地图是地图<Fivetuple,Flow,FlowCMP>,其中FlowCMP是使用MEMCMP的结构,以查看Fivetuple A是否小于Fivetuple B,就像运算符<。要查找数据包的流程是否存在,我编写的代码如下,其中m是地图的名称,而五_ tuple是一个fivetuple,其中包含从数据包中提取的信息:
auto it = m.find(five_tuple);
if( it == m.end())
{
//swap source and dest ip/port in five_tuple,
it = m.find(five_tuple);
if(it == m.end())
{
//do something
}
}
在VS2010中的调试版本中,结果是合理的。当我将其更改为发行版本时,我发现第二次M.Find并没有返回正确的迭代器,而是大部分时间都给了我M.End。我发现没有初始化问题。如何解决发布版本问题?
似乎您正在fivetuple对象上执行memcmp()。那是不确定的行为,因为fivetuple包含落后的垃圾字节。这些尾随垃圾字节在调试版本和发行版中有所不同,因此您会获得不同的结果。您应该重写FlowCMP,以便它不使用memcmp()。
这是基于提供的有限信息的猜测,但是如果要测试,请尝试cout << sizeof(FiveTuple);
。我敢打赌,您会看到sizeof(FiveTuple) > sizeof(short) + sizeof(short) + sizeof(int) + sizeof(int) + sizeof(char)
。换句话说,您的结构中有垃圾,您不应该使用memcmp。
当然,memcmp是由于另一个原因不好,因为这意味着您的代码将是不可存储的,因为它的行为将取决于您平台的 endianess 。这本身就是足够的理由,不将memcMP用于此目的。
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- C++:TypeDef使用元组
- 使用std::multimap迭代器创建std::list
- 从不同线程使用int64的不同字节安全吗
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 你如何使std::变体的使用更"palatable",语法方面?
- 如何在C ++(qt)代码中使用python脚本?(网页抓取方面)
- 在内存使用方面,c++ 中的 map 和 unordered_map 之间有什么区别吗?
- 在内存使用或编译时间方面更好的是什么
- 性能方面,使用"nullptr"还是仅使用"0"更快?
- 在性能和内存使用方面,“静态const”,“ #define”和“枚举”之间的差异
- STL Map.使用VS2010在调试和发布方面的表现不同
- 在内存使用方面,templates+functors/lambdas是否次优
- 如何使用Boost.在睡眠方面,以类似于Unity3D Coroutine的方式使用Coroutine
- 在 Windows 上的环回接口上使用 tcp/ip 的延迟方面可以预期的情况
- 什么时候应该使用派生类方面来代替基类方面
- 对于非pod对象,xvalue和右值在允许使用或行为方面的差异示例是什么?
- 在使用内存方面,用户定义的堆栈和内置的堆栈有什么区别?
- c++标准在c++ 14中对不确定值和未定义行为的使用方面有改变吗?
- 当使用成员超过函数变量时,在优化/速度方面有任何差异吗?