首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >类方法的C++ lambdas

类方法的C++ lambdas
EN

Stack Overflow用户
提问于 2018-03-07 19:08:50
回答 1查看 5.2K关注 0票数 7

作为一个假设问题,我想使用lambdas作为类方法。我知道这在职业环境下是不好的,但我还是很好奇。举个例子也许是展示我想做什么的最好的例子。下面是复数的基本类:

代码语言:javascript
复制
class Complex {
    private:
        double re, im;
    public:
        Complex() : re(0.0), im(0.0) {}
        Complex(double re, double im) : re(re * 1.0), im(im * 1.0) {}
        Complex(const Complex &c) = default;

        ~Complex() = default;

        function<double(void)> getRe = [=]() -> double { return re; };
        function<void(double)> setRe = [&](double re) -> void { this->re = re; };

        function<double(void)> getIm = [=]() -> double { return im; };
        function<void(double)> setIm = [&](double im) -> void { this->im = im; };

};

起初,我尝试使用auto,而不是显式地指定函数类型,但是我遇到错误,说我不能在非静态字段中使用auto

这似乎确实有效,因为它显然会产生期望的行为。我用它画了一些分形,用OpenGL,所以它最后做了一些相当密集的工作。

正如我说的那样,我已经为setter使用了引用捕获,特别是因为我认为由于this是对当前实例的引用,所以可能需要引用,而且由于默认情况下,标识符会在类范围内搜索(在本例中)并查找字段,因此对getter的值捕获也是必要的。

我有两个问题:

  1. 我还没有在visual中测试过这一点,但是在我使用的CLion和MSVC编译器中,this被突出显示为一个不存在的变量(尽管它“工作”)。知道为什么会这样吗?
  2. 这门课最后表现得很慢。以超过一个数量级的速度慢下来。当我使用普通的getter和setter(如double getRe() {return re;} )时,呈现从绝对即时到2-3秒不等。这一切为什么要发生?
EN

回答 1

Stack Overflow用户

发布于 2018-03-07 19:19:25

请允许我为您修复此代码:

代码语言:javascript
复制
struct Complex {
    double re, im;
    Complex() : re(0.0), im(0.0) {}
    Complex(double re, double im) : re(re * 1.0), im(im * 1.0) {}
    Complex(const Complex &c) = default;

    ~Complex() = default;
};

完全相同的结果,更好的可读性,更小的内存占用。勇敢点儿。您的代码对于const-正确性来说也是相当糟糕的。

是的,由于多种因素,您的代码非常慢:

  • 您对方法的调用现在已经虚拟化,因此它们没有内联,因此您将因此而受到严重的惩罚。
  • 您的对象创建/销毁现在很可能导致动态内存分配/释放。
  • 您的对象没有变得更大,因此更多的缓存丢失。
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49159534

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档