相关疑难解决方法(0)

不同编译器中的pure/const函数属性

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)

c++ gcc const function-attributes

32
推荐指数
2
解决办法
8710
查看次数

如何在gcc中声明和定义纯函数?

GCC具有pure和const属性,其中const实际上用于真正的纯函数(纯函数是幂等函数,也是无副作用的).

那么如何使用const-attribute声明和定义一个函数呢?

编辑:我对真正的纯函数感兴趣,使用const属性声明的函数,而不是使用pure-attribute声明的函数.

c++ gcc

6
推荐指数
2
解决办法
1126
查看次数

c ++用const参数而不是非常量参数覆盖虚函数

当我在写一个带有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)

c++ overriding constants signature

5
推荐指数
2
解决办法
330
查看次数

使值传递的参数不变的重点是什么?

这是一个更普遍的问题: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前者没有任何意义.

c++ const pass-by-value

4
推荐指数
2
解决办法
116
查看次数