Класс перегрузки для энергозависимых и энергонезависимых экземпляров

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

class Yield {
public:
Yield();
Yield(Yield const &other);
Yield(Yield const volatile &other);

Yield &operator=(Yield const &other);
Yield &operator=(Yield const volatile &other);

Yield &operator+=(Yield const &other);
Yield &operator+=(Yield const volatile &other);
Yield volatile &operator+=(Yield const &other) volatile;
Yield volatile &operator+=(Yield const volatile &other) volatile;

// Other operators snipped...
};
  • Вопрос 1: При компиляции с MSVC я получаю следующее предупреждение:

    warning C4521: 'util::Yield' : multiple copy constructors specified

    Предвещает ли это предупреждение какие-либо проблемы при использовании этого класса? Или это можно безопасно игнорировать?

  • Вопрос 2: Все операторы перегружены как для энергозависимых, так и для энергонезависимых other аргумент. Я предполагаю, что это необходимо для того, чтобы избежать более медленного доступа к энергонезависимым экземплярам? Есть ли альтернатива, позволяющая кодировать каждый метод только дважды (энергозависимые lhs и энергонезависимые lhs), а не 4 раза (энергозависимые и энергонезависимые lhs, каждый с летучими и энергонезависимыми rhs)?

Я надеюсь, что совместить эти вопросы в порядке, в противном случае, пожалуйста, оставьте комментарий, и я могу разделить их.
Спасибо!

3

Решение

Летучий не делает то, что вы думаете, что делает.

Даже с особенным, нестандартным VC ++ volatile поведение, это приводит к более медленному коду, чем правильное написание. использование std::atomicили, если это не доступно, то у вас, вероятно, есть специфический для платформы барьер, забор и атомные свойства. VC ++ имеет _ReadWriteBarrier а также _Interlocked функции, чтобы помочь вам.

2

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

Класс имеет несколько конструкторов копирования одного типа. Это предупреждение носит информационный характер; конструкторы могут вызываться в вашей программе.

С сайта MSDN: Предупреждение компилятора (уровень 3) C4521

3

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