2015-06-21 1 views
0

В C++, когда мы делаем что-то вроде этого:ли анонимные функции постоянны в памяти, или они проходят по значению

void a_function(void (*function_name)(char *data)) 
{ 
    char *data = new char[1]; 
    function_name(data); 
} 

a_function([](char *data) { 
    //do sth 
}); 

я думаю function_name является указателем на функцию. Но когда я передаю анонимную функцию, это пробел в памяти, выделенной для этой функции перед передачей?

Если я не передал анонимную функцию, но передал адрес существующей функции, будет ли это равноценным коду выше?

ответ

2

На практике у lambda без состояния есть функция, которая существует, пока компилятор не может доказать, что никто его не вызывает. Эта функция хранится в исполняемом файле во время компиляции и загружается во время выполнения. Запрет DLL или так формат (или другие подобные вещи), он живет до тех пор, пока программа работает.

В теории есть допустимые указатели функций, которые при вызове запускают функцию. Указатель, который вы получаете из безгражданской лямбды, является допустимым указателем на функцию, и он не становится недействительным, когда уничтожается лямбда, из которого он создан.

+0

Спасибо, это было то, что я ищу. –