Как std :: function конвертируется компилятором? Runtime участвует? - PullRequest
0 голосов
/ 09 апреля 2020

Я использую этот вид кода для некоторых различных плагинов, которые я делаю:

#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;
}

Он должен быть мягким во время выполнения, так как он имеет дело со звуком на более высокой выборке -тарифы. Я хотел бы убедиться, что функциональные w / lambdas не будут включать «дополнительную» обработку во время выполнения.

Таким образом, мне было бы приятно понять, как компилятор будет переводить это mCopySharedData в структурах. Есть ли шанс получить какой-нибудь причудливый псевдокод / ​​код в стиле c ++?

Чтобы узнать, нет ли каких-либо "magi c", когда он вызывает эту функцию. Конечно, я мог бы использовать Godbolt и увидеть сам код, но это ассемблер, не совсем мой язык:)

РЕДАКТИРОВАТЬ: Я буду sh это переведет mCopySharedData(mSharedData) в что-то вроде этого:

mSharedData.mPhase = pointerToPlugin->mPhase;

Это правильно?

...