2016-05-04 158 views
1

对于某个对象的唯一标识,我可以用两种方法创建计数器,但我不知道哪一个更好虽然它们在代码中有很大不同不是字节码,我不知道)。函数内的静态变量vs C++中的静态类变量

第一种方法是将有它使用一个静态变量一些功能:

部首:

unsigned int GetNextID(); 

CPP:

unsigned int GetNextID() 
{ 
    static unsigned id{0}; 
    return id++; 
} 

另一个选项:

部首:

class UniqueIdGenerator 
{ 
public: 
    static unsigned int GetNextID(); 

private: 
    static unsigned int mID; 
} 

CPP:

unsigned int UniqueIdGenerator::mID = 1; 

unsigned int UniqueIdGenerator::GetNextID() 
{ 
    return ++mID; 
} 

仅供参考,我已经read前者不是线程安全的,但我不明白为什么后者将是要么。如果有的话,我更喜欢简单的功能,因为它更简单,更简单&。

+4

FWIW,你说得对。这两个实现都不是线程安全的。 –

+0

只是为了让它更清楚,因为人们关注线程安全(如果我的问题很模糊,我很抱歉):我在问为什么两种方法都会更好。如果他们只是线程不安全,那么线程安全不应该进入讨论。 – ikku100

回答

1

区别在于静态变量的范围/可见性。类成员可以被多个方法共享,方法中的变量不能。

根据数据应该尽可能私有的原则,如果方法中的静态变量满足您的需求,则该方法中的静态变量更安全。

为了线程安全的讨论时初始化变量,看this question.,但使用的变量不是线程安全的,除非你采取一些步骤,以确保它是受保护的(无论是使用和原子(最好为一个简单的值),或用互斥锁保护它(如果数据超过一件应该受到保护))

2

要使它线程安全的,你应该更改为std::atomic<unsigned> mID,写你的函数作为

return mID.fetch_add(1); 

你选择哪个版本应该不重要,一个虽然在我看来,自由函数会是我喜欢的函数,因为不可能在函数之外访问变量。