Fer*_*cio 13 c++ methods const
我知道该函数不允许更改对象的状态,但我想我在某处读过允许编译器假设如果使用相同的参数调用函数,它将返回相同的值,因此可以重用缓存值(如果可用).例如
class object
{
int get_value(int n) const
{
...
}
...
object x;
int a = x.get_value(1);
...
int b = x.get_value(1);
Run Code Online (Sandbox Code Playgroud)
然后编译器可以优化第二个调用,并使用寄存器中的值或只是执行 b = a;
这是真的?
Ant*_*ams 24
const是关于程序语义而不是实现细节.您应该const在不更改对象的可见状态时标记成员函数,并且应该在对象本身上可调用const.在类的const成员函数内X,类型this是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;
}
};
Run Code Online (Sandbox Code Playgroud)
如果通过指针保持数据,而不是直接(包括智能指针如std::auto_ptr或boost::shared_ptr),则指针变为const在一个const构件的功能,但不被指向的数据,因此可以修改所指向的数据.
至于缓存:通常编译器不能这样做,因为状态可能在调用之间改变(特别是在我的多线程示例中使用互斥锁).但是,如果定义是内联的,那么编译器可以将代码拉入调用函数并优化它在那里看到的内容.这可能导致该函数仅被有效地调用一次.
下一版本的C++标准(C++ 0x)将有一个新的关键字constexpr.标记的函数constexpr返回一个常量值,因此可以缓存结果.在这样的函数中你可以做什么是有限制的(为了编译器可以验证这个事实).
| 归档时间: |
|
| 查看次数: |
4937 次 |
| 最近记录: |