我知道该函数不允许更改对象的状态,但我想我在某处读到允许编译器假设如果使用相同的参数调用该函数,它将返回相同的值,因此可以重用缓存值(如果可用)。例如
class object
{
int get_value(int n) const
{
...
}
...
object x;
int a = x.get_value(1);
...
int b = x.get_value(1);
那么编译器可以优化第二个调用并使用寄存器中的值或简单地执行b = a;
这是真的?
const
是关于程序语义而不是实现细节。你应该标记一个成员函数const
当它不改变对象的可见状态时,并且应该可以在本身的对象上调用const
。在一个const
类的成员函数X
,类型this
is X const *
: 指向常量的指针X
目的。因此所有成员变量都是有效的const
在该成员函数内(除了mutable
那些)。如果你有一个const
对象,只能调用const
其上的成员函数。
您可以使用mutable
表明成员变量甚至可以在一个const
成员函数。这通常用于标识用于缓存结果的变量,或者用于不影响实际可观察状态的变量,例如互斥体(您仍然需要将互斥体锁定在const
成员函数)或使用计数器。
class X
{
int data;
mutable boost::mutex m;
public:
void set_data(int i)
{
boost::lock_guard<boost::mutex> lk(m);
data=i;
}
int get_data() const // we want to be able to get the data on a const object
{
boost::lock_guard<boost::mutex> lk(m); // this requires m to be non-const
return data;
}
};
如果您通过指针而不是直接保存数据(包括智能指针,例如std::auto_ptr
or boost::shared_ptr
) 那么指针就变成const
in a const
成员函数,但不是指向的数据,因此可以修改指向的数据。
至于缓存:一般来说,编译器无法执行此操作,因为状态可能会在调用之间发生变化(特别是在我使用互斥锁的多线程示例中)。但是,如果定义是内联的,则编译器可以将代码拉入调用函数并优化在那里看到的内容。这可能会导致函数有效地只被调用一次。
下一个版本的C++ 标准 (C++0x) http://www.open-std.org/jtc1/sc22/wg21/将有一个新的关键字constexpr
。功能标记constexpr
返回一个常量值,因此可以缓存结果。在这样的函数中可以执行的操作是有限的(以便编译器可以验证这一事实)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)