【发布时间】:2014-07-30 23:59:03
【问题描述】:
我有一个类,在实例化时需要获取一些唯一的 id 才能工作。 最初我想使用一个分配和递增的静态函数。 我不需要它们是连续的,只要是唯一的。
class A {
int id_1;
int id_2;
int id_3;
public:
static int last_id=0;
static int get_id(){ return A::last_id++; }
...
A(){ id_1 = A::get_id(); id_2 = A::get_id(); id_3 = A::get_id(); }
};
现在,我正在考虑使用多线程。 我认为静态函数将是一个瓶颈,因为我在一开始就构建了这些对象的几十万个实例。 在程序结束之前我不会销毁任何实例,因此在初始化后它们是固定的。 无论如何,它们不是在编译时计算的,因为数量取决于命令行参数。
我想到的另一种方法是使用内存地址,它们至少在一台计算机中是唯一的。
类似:
class A {
int* id_1;
int* id_2;
int* id_3;
public:
static int last_id=0;
static int get_id(){ return A::last_id++; }
...
A(){ id_1 = new int(0); id_2 = new int(0); id_3 = new int(0); }
~A() { delete id_1; delete id_2; delete id_3(); }
};
然后我会将标识符读取为指针的地址。
问题:这样使用指针有意义吗?
【问题讨论】:
-
它们仅在此过程中是唯一的(并且它们可能不按顺序排列)。另外,我看不出
new比在 int 上执行++更容易成为瓶颈! -
据我所知,
new是线程安全的,同样会成为瓶颈 -
也绝对没有强制将内存指针作为 GUID 的,除非您打算从不释放任何东西。一旦一些内存被释放,它的指针空间就会被备份。
-
我觉得你在真正知道瓶颈是什么之前就已经在优化了。增加一个整数会非常便宜!建议:使用
std::atomic<int>而不是int,这样它就可以与多个线程一起使用。 -
@dvicino: 关心,
this + 1已经在this对象之外(相当于&(this[1]))。你的意思是reinterpret_cast<char*>(this) + n。当n >= sizeof(*this)时,后者将在对象之外。
标签: c++ multithreading pointers c++11