Я пишу класс, который должен поддерживать как энергозависимые, так и энергонезависимые экземпляры (энергозависимые экземпляры используют атомарные операции, энергонезависимые экземпляры используют регулярные операции), и мне интересно, правильно ли я это делаю. Вот фрагмент объявления класса:
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)?
Я надеюсь, что совместить эти вопросы в порядке, в противном случае, пожалуйста, оставьте комментарий, и я могу разделить их.
Спасибо!
Летучий не делает то, что вы думаете, что делает.
Даже с особенным, нестандартным VC ++ volatile
поведение, это приводит к более медленному коду, чем правильное написание. использование std::atomic
или, если это не доступно, то у вас, вероятно, есть специфический для платформы барьер, забор и атомные свойства. VC ++ имеет _ReadWriteBarrier
а также _Interlocked
функции, чтобы помочь вам.
Класс имеет несколько конструкторов копирования одного типа. Это предупреждение носит информационный характер; конструкторы могут вызываться в вашей программе.
С сайта MSDN: Предупреждение компилятора (уровень 3) C4521