статическая переменная внутри функции против статической переменной класса в переполнении стека

Для уникального идентификатора для некоторого объекта я могу создать счетчик двумя способами, но я не знаю какой из них лучше в то время как они довольно различны в коде (хотя, возможно, не в байт-коде, я понятия не имею).

Первый способ — использовать функцию, которая использует статическую переменную:

Заголовок:

unsigned int GetNextID();

каст:

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

Другой вариант:

Заголовок:

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

private:
static unsigned int mID;
}

каст:

unsigned int UniqueIdGenerator::mID = 1;

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

К вашему сведению читать что первое не является потокобезопасным, но я не понимаю, почему второе тоже будет. Во всяком случае, мне больше нравится простая функция, так как она проще & короче.

1

Решение

Разница заключается в объеме / видимости статической переменной. Член класса может совместно использоваться несколькими методами, переменная в методе не может.

Исходя из того, что данные должны быть максимально конфиденциальными, статическая переменная в методе безопаснее, если она соответствует вашим потребностям.

Для обсуждения безопасности потока, когда инициализация переменная, см. этот вопрос., но использование переменной не является потокобезопасным, если только вы не предпримете несколько шагов, чтобы убедиться, что она защищена (или использовать атомарную (предпочтительно для простого значения), или защитить ее мьютексом (если существует более одного фрагмента данных, быть защищенным))

1

Другие решения

Чтобы сделать потокобезопасным, вы должны изменить на std::atomic<unsigned> mIDи напишите свою функцию как

return mID.fetch_add(1);

Выбор версии не должен иметь значения, хотя, на мой взгляд, я бы предпочел, чтобы свободная функция была доступной, поскольку доступ к переменной вне функции невозможен.

2

По вопросам рекламы [email protected]