在使用VisualVM监视java程序时,我注意到垃圾收集器的行为中有一个有趣的模式.看起来很常见,在执行"正常"垃圾收集运行之后,GC会执行第二次,更多的cpu密集运行,这似乎没有额外的影响(更积极的运行之后使用的堆与它是在打火机之后).
我已经在VisualVM的输出上指出了你可以看到垃圾收集器运行和相应的堆使用变化.
我的问题基本上是垃圾收集器在这里做什么以及为什么?当有足够的可用内存时,是什么导致它尝试这些真正的cpu密集型运行,并且与较轻的运行相比没有可观察到的好处?或者我是否误解了图表?
该计划的表现并没有真正受到影响,我只是好奇.
在我正在进行的项目中,我有一个相当大的模板类,我已经实现了这样:
我有我的头文件
// MyBigClass.h
#ifndef MYBIGCLASS_H
#define MYBIGCLASS_H
template <typename T>
class MyBigClass {
/* -- snip -- */
};
#include "MyBigClass.cpp"
#include "MyBigClass_iterator.cpp"
#include "MyBigClass_complicatedFunctionality_1.cpp"
#include "MyBigClass_complicatedFunctionality_2.cpp"
#endif
Run Code Online (Sandbox Code Playgroud)
然后我的所有实现文件基本上都是这样的:
// MyBigClass_foobar.cpp
template <typename T>
void MyBigClass<T>::member_1(){
/* -- snip -- */
}
template <typename T>
int MyBigClass<T>::member_2(int foo, T & bar){
/* -- snip -- */
}
// etc, etc
Run Code Online (Sandbox Code Playgroud)
在main.cpp
,我只是包括MyBigClass.h
,一切正常,编译得很好.我将实现分成多个文件的原因是因为我更喜欢处理三个或四个200-400行文件,而不是一个1200行文件.文件本身在逻辑上是相当有条理的,仅包含嵌套类的实现或一组相互关联的成员函数.
我的问题是,这是完成了吗?前几天我向别人展示时,我得到了一个奇怪的反应,所以我想知道这是不是一种不好的做法,或者是否有更好,更常用的方式来完成这样的事情.
我目前有矢量,如:
vector<MyClass*> MyVector;
Run Code Online (Sandbox Code Playgroud)
我访问使用
MyVector[i]->MyClass_Function();
Run Code Online (Sandbox Code Playgroud)
我想利用shared_ptr
.这是否意味着我所要做的就是将我vector
改为:
typedef shared_ptr<MyClass*> safe_myclass
vector<safe_myclass>
Run Code Online (Sandbox Code Playgroud)
我可以继续使用我之前的其余代码吗?
我想知道如何获得大小std::tr1::array<int, 16> >
?
它只是16*sizeof(int)
,这是如何16字节?
在C++中,我想要一个带有vector类型的可选参数的函数.如果没有提供参数,我希望变量的大小为0.我目前有
void v_connect::import(vector<int> vid_,vector<double> vpos_,vector<int> vbd_,vector<int> bd_ss_=std::vector<int>() )
Run Code Online (Sandbox Code Playgroud)
但这不起作用.基本上,如果用户提供可选参数,bd_ss_
我想进行检查bd_ss_.size()!=0
,然后做一些额外的事情.如果用户没有提供参数,我想要bd_ss.size()==0
.这可能吗?