小编Nav*_*een的帖子

如何知道对象创建是否在堆上..?

我们希望在低延迟系统上工作,堆分配在应用程序中更昂贵.但是在某种程度上允许在堆上创建对象.这就是为什么我们想要指示是否在堆上创建对象..?

下面的方法是找出堆内存上创建的对象的正确方法吗?

将具有泛型类,其中new和delete运算符被重载以维护堆分配的指针....

#include <iostream>
#include <set>

using namespace std;

class MemStat              //base class
{
    typedef set<MemStat*> POINTERS; 
    static POINTERS m_ptrlist;
public:
    void* operator new (size_t size)
    {
        MemStat* ptr = ::new MemStat;
        m_ptrlist.insert(ptr);
        return ptr;
    }
    void operator delete(void* dptr)
    {
        MemStat* ptr = static_cast<MemStat*>(dptr);
        m_ptrlist.erase(ptr);
        ::delete ptr;
    }
    // void* operator new[] (size_t sz);
    // void operator delete[] (void*);

    bool is_on_heap() { m_ptrlist.find(this) != m_ptrlist.end(); }

protected:             // ctor & dtor are protected for restrictions
    MemStat() { } …
Run Code Online (Sandbox Code Playgroud)

c++ heap memory-management

4
推荐指数
1
解决办法
1087
查看次数

在不同的标准C++ STL上维护一组唯一的元素

我必须开发一个组件,它将拥有超过100,000个类的实例.我想根据特定类的不同标准(成员)生成报告.例如,具有数据字段id,名称,addr,phoneno的员工类.报告生成将基于


  1. names_ascending
  2. names_descending
  3. addr_ascending
  4. phoneno_asceding
  5. unique_names
  6. unique_addr
  7. unique_phoneno

每次调用的实例的运行时迭代非常慢,因为它是对大量实例的线性操作,需要排序机制.

所以我以不同的排序方式在容器中存储了每个实例的指针.但是需要更多的内存.请建议我这样做的更好方法.我已经发布了我遵循的示例代码片段以实现上述目标.

class Employee
{
    int    m_id;
    string m_name;
    string m_addr;
    string m_phone;

public:
    Employee(int id, string name, string addr, string phone) : 
         m_id(id), m_name(name), m_addr(addr), m_phone(phone) { }

    int    id()      const { return m_id;    }
    string name()    const { return m_name;  }
    string addr()    const { return m_addr;  }
    string phoneno() const { return m_phone; }
};

//custom predicate for std containers
struct IDComparator
{
    bool operator() (const Employee* e1, const …
Run Code Online (Sandbox Code Playgroud)

c++

3
推荐指数
1
解决办法
814
查看次数

STL std :: map动态排序

我知道这可能是一个愚蠢的问题.但我很困惑.Wrt std :: map.我为地图的动态排序编写了一个自定义谓词,

enum OrderingType 
{
    ASCENDING, 
    DESCENDING 
};

template <class T>
class Ordering
{
    OrderingType m_order;

public:
    Ordering(OrderingType order) : m_order(order) { }

    bool operator() (const T &obj1, const T &obj2)
    {
        if( m_order == ASCENDING )
            return obj1 < obj2;

        if( m_order == DESCENDING )
            return obj1 > obj2;
    } 
};
Run Code Online (Sandbox Code Playgroud)

优点是

  1. 在某些条件下,我们可以决定地图中数据元素的顺序

    OrderType type =(condition?ASCENDING:DESCENDING); CUSTOMMAP m(类型);

  2. 我们可以使用相同的前向迭代器来升序和降序有序映射

    在下面的代码中.map的排序在升序和降序(amp1和map2)中都能正常工作.但是在赋值map2 = map1时,map2的顺序随内容一起变化.我被期望只复制内容,而不是订单的变化.map2上的进一步插入(声明为降序)将按升序排列.

任何建议或想法..?或者为地图定义双向排序谓词是个坏主意.?

typedef map<int, int, Ordering<int> >  CUSTOMMAP;
typedef CUSTOMMAP::iterator       CUSTOMMAP_ITER;
typedef CUSTOMMAP::const_iterator CUSTOMMAP_CONST_ITER;

ostream& operator …
Run Code Online (Sandbox Code Playgroud)

c++

3
推荐指数
1
解决办法
1416
查看次数

标签 统计

c++ ×3

heap ×1

memory-management ×1