首页 > 解决方案 > 编译器如何转换 std::function?涉及运行时?

问题描述

我正在为我正在制作的一些不同的插件使用这种代码

#include <iostream>
#include <functional>

template <class T>
struct SharedDataEngine {
    T mSharedData;
    std::function<void(T &destination)> mCopySharedData;

    SharedDataEngine(std::function<void(T &destination)> copySharedData) : mCopySharedData(copySharedData) {
    } 

    void storeSharedData() {
        if (mCopySharedData != NULL) {
            mCopySharedData(mSharedData);
        }
    }
};

struct Plugin {
    float mPhase = 10.0f;

    struct SharedData {
        float mPhase;
    };
    SharedDataEngine<SharedData> mSharedDataEngine{[this](SharedData &destination) {
        destination.mPhase = mPhase;
    }};     
};

int main() {   
    Plugin plugin;

    std::cout << plugin.mSharedDataEngine.mSharedData.mPhase << std::endl;

    plugin.mPhase = 20.0f;
    plugin.mSharedDataEngine.storeSharedData();

    std::cout << plugin.mSharedDataEngine.mSharedData.mPhase << std::endl;
}

它在运行时必须是软的,因为它以更高的采样率处理音频。我想确保带有 lambda 的功能不会涉及运行时“额外”处理。

因此,我很高兴了解编译器将如何mCopySharedData在结构中翻译它。有机会获得一些花哨的伪代码/c++ 风格的代码吗?

看看它调用该函数后是否有任何“魔法”。我当然可以使用 Godbolt 并自己查看代码,但那是汇编,不是我真正的语言 :)

编辑: 我希望它会转化mCopySharedData(mSharedData)为这样的东西:

mSharedData.mPhase = pointerToPlugin->mPhase;

这是对的吗?

标签: c++lambdacompiler-constructionfunctor

解决方案


推荐阅读