C++ 避免易失性和非易失性成员函数的代码重复

C++ 避免易失性和非易失性成员函数的代码重复,c++,C++,在下一个示例中,如何避免为volatile和non-volatilefoo方法编写相同的主体(bar++;) #include <iostream> struct A { int bar = 0; void foo() { bar++; } void foo() volatile { bar++; } }; int main() { A a; a.foo(); volatile A va; va.foo(); }

在下一个示例中,如何避免为volatile和non-volatile
foo
方法编写相同的主体(
bar++;

#include <iostream>

struct A { 
    int bar = 0;
    void foo() { bar++; } 
    void foo() volatile { bar++; } 
};

int main() {
    A a;
    a.foo();

    volatile A va; 
    va.foo();
}
#包括
结构A{
int bar=0;
void foo(){bar++;}
void foo()volatile{bar++;}
};
int main(){
A A;
a、 foo();
挥发性A-va;
va.foo();
}

这个问题完全类似于,但由于常量和非常量版本不会影响编译器优化,我想知道:如果对volatile应用相同的答案,因为volatile会使代码变慢,所以对于非volatile的使用不是效率很低吗?

因为volatile方法可以为非volatile对象调用,只是简单地丢弃非volatile方法

无论如何,
volatile
几乎没有什么用处,请参见,因此不要让代码变得复杂,如果没有很好的理由,也不要使用此关键字

如果对volatile应用相同的答案,那么对于非volatile的使用不是效率低下,因为volatile会使代码变慢吗

在下一个示例中,如何避免为volatile和non-volatile foo方法编写相同的主体(bar++;)

#include <iostream>

struct A { 
    int bar = 0;
    void foo() { bar++; } 
    void foo() volatile { bar++; } 
};

int main() {
    A a;
    a.foo();

    volatile A va; 
    va.foo();
}
就我所知,使用非静态成员函数的唯一选择是将函数体放入类似于宏的函数中

最好使用非成员(或静态成员)函数模板:

template<class AA>
void foo(AA& a) { a.bar++; }
模板
voidfoo(AA&a){a.bar++;}

这不需要重复,可以使用
volatile
或非
volatile
对象调用。

如果只保留volatile方法,效率会更低。问题是你是否可以避免效率低下和重复代码。在我看来,你根本不应该使用
volatile
@不幸的是,我真的必须使用它(对于CUDA托管内存访问同步)。@ BHVNILIGAG,我不知道CUDA,虽然在C++中,Valk不用于内存访问同步,STD::is@JVApenCUDA编程指南提到volatile的使用是一个正确和必要的事情,在这里和这里都是一个好主意!可能模板方法是可能实现的最佳方法。