小编260*_*607的帖子

为什么我的C++程序的内存使用量不断增长?

我是Linux和C++的新手,对我的应用程序的内存使用情况有疑问.

我的应用程序处理大量实时数据,每秒约500条消息.

我使用std :: map来管理(即插入和擦除)所有消息.例如,

std::map<int, data_struct> m_map;

// when receive a new message, convert the message into a data structure
m_map.insert(std::pair<int, data_struct>(message.id, data));

// when need to erase a message
iter = m_map.find(id);
if (iter != m_map.end()) {
    m.map.erase(iter);
}
Run Code Online (Sandbox Code Playgroud)

m_map的大小大约是2500,即应用程序在开始时收到很多新消息,然后逐渐需要擦除消息.大约10秒后,它达到了一个点,即收到的新消息数与需要删除的消息大致相同.

我的问题是,大约20分钟后,在Linux 系统监视器中,我注意到我的应用程序使用的内存大约是1GB.而且看起来每20分钟翻一番.这是正常的,应用程序真的使用了那么多内存吗?我在这里错过了什么吗?

谢谢.

c++ linux memory

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

提升,指向互斥锁的指针,会起作用吗?boost :: mutex和std :: vector,noncopyable问题

下面的代码会给我一个错误,因为boost :: mutex是不可复制的,而xyz.push_back()是一个复制构造函数.

class XYZ
{
    public:
        double x;
        boost::mutex x_mutex;
}

vector<XYZ> xyz;
xyz.push_back(XYZ());
Run Code Online (Sandbox Code Playgroud)

所以我试过这样的事,

class XYZ
{
    public:
        double x;
        boost::mutex * x_mutex;
}

vector<XYZ> xyz;
xyz.push_back(XYZ());
Run Code Online (Sandbox Code Playgroud)

它没有错误,但问题是"互斥体实际上是否会按原样运行?" 这是在类中封装互斥体,然后创建该类的向量的好方法吗?

谢谢.

c++ multithreading boost mutex boost-thread

2
推荐指数
1
解决办法
3403
查看次数

C++ getter/setter,互斥锁,细粒度锁定

我有一个由多个线程共享的对象,我想锁定单个成员变量,而不锁定整个对象,以便不同的线程可以同时访问不同的成员变量.阅读完一些文章后,我使用shared_mutex和getter()/ setter()函数编写代码.

    class Test
    {
    public:
    **// variable, shared_mutex and getter/setter for x**
    double x;
    boost::shared_mutex x_mutex;
    double x_getter();
    void x_setter();
    **// variable, shared_mutex and getter/setter for y**
    ......
    **// variable, shared_mutex and getter/setter for z**
    ......
    };

    double Test::x_getter()
    {
      // get shared access
      boost::shared_lock lock(_access);
      return x;
    }

    void Test::x_setter()
    {
      // get exclusive access
      boost::unique_lock lock(_access);
      // do something with x;
    }

    //getter/setter functions for y and z. 
    ......
Run Code Online (Sandbox Code Playgroud)

代码看起来很笨拙,特别是当成员变量的数量增加时.我想知道这类问题是否有更好的解决方案.

谢谢.

c++ multithreading boost mutex boost-thread

2
推荐指数
1
解决办法
2509
查看次数

C++ 11 GCC 4.6.2 std :: move

我尝试使用移动构造函数,使用std :: move

#include <utility>
Run Code Online (Sandbox Code Playgroud)

但我收到一个错误,'move'不是'std'的成员.

gcc --version
gcc (GCC) 4.6.2 20111027 (Red Hat 4.6.2-1)
Run Code Online (Sandbox Code Playgroud)

我理解移动构造函数是C++ 11中的一个新特性,只是想知道它是否在gcc 4.6.2中可用.

谢谢.

c++ gcc c++11

2
推荐指数
1
解决办法
4403
查看次数

gnu gcc如何禁止警告:在此声明中忽略'typedef'[默认启用]

我在Fedora 16上使用GNU gcc 4.6.2.我正在使用第三方API编写应用程序,在编译之后,我收到了很多警告.

warning: ‘typedef’ was ignored in this declaration [enabled by default]
Run Code Online (Sandbox Code Playgroud)

只是想知道如何压制这个?我用-Wall标志编译我的程序.

在本文档http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html中,它提到了类似-Wunused-local-typedefs的内容.

我尝试过-Wno-unused-local-typedef,但不起作用.

谢谢.

c++ gcc warnings gnu

2
推荐指数
3
解决办法
2万
查看次数

C++ STL容器:: clear :: swap

"清除"大型STL容器的最快方法是什么?在我的应用程序中,我需要处理大尺寸std::map,例如10000个元素.

我已经测试了以下3种方法来清除a std::map.

  • 每次需要时创建一个新容器.
  • 通话map::clear()方式.
  • 通话map::swap()方式.

它似乎::swap()给出了最好的结果.有谁可以解释为什么会这样,拜托?可以说使用map::swap()method是"清除"std :: map的正确方法吗?它是同其他STL容器,例如set,vector,list等.

    m_timer_start = boost::posix_time::microsec_clock::local_time();

//  test_map.clear();
    test_map.swap(test_map2);
    for (int i = 0; i< 30000; i++){
        test_map.insert(std::pair<int, int>(i, i));
    }    

//  std::map<int, int> test_map_new;
//  for (int i = 0; i< 30000; i++){
//      test_map_new.insert(std::pair<int, int>(i, i));
//  }     

    m_timer_end = boost::posix_time::microsec_clock::local_time();
    std::cout << timer_diff(m_timer_start, m_timer_end).fractional_seconds() << std::endl; // microsecond
Run Code Online (Sandbox Code Playgroud)

c++ dictionary stl std

2
推荐指数
1
解决办法
2660
查看次数

GNU GCC编译器优化和调试

我有一个关于Eclipse CDT和GNU GCC编译器的简单问题.

该应用程序编译在

  • 调试模式,即优化=无(-O0),调试=最大(-g3),与编译的应用程序相比
  • 优化模式,即优化=最大值(-O3),调试=无.

除了性能差异之外,是否保证在这两种模式下编译的应用程序生成完全相同的结果?

我即将向最终用户发布应用程序,该应用程序是基于服务器的,它处理多个多播数据源.任何人都可以提供一些建议,我应该为最终用户选择哪种编译模式.

谢谢.

c++ eclipse debugging optimization gnu

2
推荐指数
1
解决办法
1991
查看次数

是否可以以编程方式创建函数静态对象?

我需要创建一个向量来保存指向某些静态对象的指针(例如,a1,a2,a3).

void foo()
{
    static TEST a1, a2, a3;
    static vector<TEST *> m_test;
    m_test.push_back( &a1 );
    m_test.push_back( &a2 );
    m_test.push_back( &a3 );
}
Run Code Online (Sandbox Code Playgroud)

但我不想写出每个static对象的声明.

如何使用循环来执行此操作?我尝试过类似的东西:

    for (unsigned int i=0; i<10; i++)
    {
        m_test.push_back( &(static TEST()));
    }
Run Code Online (Sandbox Code Playgroud)

但似乎在static表达式中没有任何影响,因为对象被破坏了,正如我期望的那样,正常的临时性.

c++

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

gnu c ++浮点数精度

我有关于浮点数的简单问题,

double temp;  
std::cout.precision(std::numeric_limits<double>::digits10);
temp = 12345678901234567890.1234567890;
std::cout << (temp < std::numeric_limits<double>::max()) << std::endl;
std::cout << std::fixed << std::endl;
std::cout << temp << std::endl;
Run Code Online (Sandbox Code Playgroud)

但是,我得到的输出是这样的,

1
12345678901234567168.000000000000000
Run Code Online (Sandbox Code Playgroud)

temp的值仍然在double的范围内,但是,值完全不同.我想知道我在这里做错了什么?

谢谢.

c++

0
推荐指数
1
解决办法
268
查看次数