我是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分钟翻一番.这是正常的,应用程序真的使用了那么多内存吗?我在这里错过了什么吗?
谢谢.
下面的代码会给我一个错误,因为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)
它没有错误,但问题是"互斥体实际上是否会按原样运行?" 这是在类中封装互斥体,然后创建该类的向量的好方法吗?
谢谢.
我有一个由多个线程共享的对象,我想锁定单个成员变量,而不锁定整个对象,以便不同的线程可以同时访问不同的成员变量.阅读完一些文章后,我使用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)
代码看起来很笨拙,特别是当成员变量的数量增加时.我想知道这类问题是否有更好的解决方案.
谢谢.
我尝试使用移动构造函数,使用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中可用.
谢谢.
我在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,但不起作用.
谢谢.
"清除"大型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) 我有一个关于Eclipse CDT和GNU GCC编译器的简单问题.
该应用程序编译在
除了性能差异之外,是否保证在这两种模式下编译的应用程序生成完全相同的结果?
我即将向最终用户发布应用程序,该应用程序是基于服务器的,它处理多个多播数据源.任何人都可以提供一些建议,我应该为最终用户选择哪种编译模式.
谢谢.
我需要创建一个向量来保存指向某些静态对象的指针(例如,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表达式中没有任何影响,因为对象被破坏了,正如我期望的那样,正常的临时性.
我有关于浮点数的简单问题,
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的范围内,但是,值完全不同.我想知道我在这里做错了什么?
谢谢.