pure是一个函数属性,表示函数不会修改任何全局内存.
const是一个函数属性,表示函数不读取/修改任何全局内存.
鉴于该信息,编译器可以进行一些额外的优化.
GCC示例:
float sigmoid(float x) __attribute__ ((const));
float calculate(float x, unsigned int C) {
float sum = 0;
for(unsigned int i = 0; i < C; ++i)
sum += sigmoid(x);
return sum;
}
float sigmoid(float x) { return 1.0f / (1.0f - exp(-x)); }
Run Code Online (Sandbox Code Playgroud)
在该示例中,编译器可以将函数计算优化为:
float calculate(float x, unsigned int C) {
float sum = 0;
float temp = C ? sigmoid(x) : 0.0f;
for(unsigned int i = 0; i < C; ++i)
sum …Run Code Online (Sandbox Code Playgroud) GCC具有pure和const属性,其中const实际上用于真正的纯函数(纯函数是幂等函数,也是无副作用的).
那么如何使用const-attribute声明和定义一个函数呢?
编辑:我对真正的纯函数感兴趣,使用const属性声明的函数,而不是使用pure-attribute声明的函数.
当我在写一个带有const参数而不是非常量参数的overide函数时,我以为编译器会报错,因为base函数有非常量参数,但是编译成功了。为什么?
我的代码:
#include <iostream>
class A
{
public:
virtual uint64_t cal(uint64_t value)
{
std::cout << value << std::endl;
return value;
}
};
class B : public A
{
public:
uint64_t cal(const uint64_t value) override;
};
uint64_t B::cal(const uint64_t value)
{
std::cout << value + 1 << std::endl;
return (value+1);
}
int main()
{
B b;
b.cal(1);
return 0;
}
Run Code Online (Sandbox Code Playgroud) 这是一个更普遍的问题:const如果通过值传递函数参数,是否有任何意义?
在我正在研究的代码中,我看到了很多以下内容:
void some_function(const std::vector<double> some_vec);
Run Code Online (Sandbox Code Playgroud)
std::vector是按值传递的,那么接下来的是什么const呢?
就像我理解函数是否通过引用传递向量一样:
void some_function(const std::vector<double> &some_vec);
Run Code Online (Sandbox Code Playgroud)
但我认为const前者没有任何意义.