Unterschiedliche Stack-Tiefe für Lambdas und reguläre Funktionen in C ++?

8

Betrachten Sie eine normale rekursive Funktion:

%Vor%

Dies endet bei 43033 .

Betrachten Sie nun ein rekursives Lambda:

%Vor%

Dies endet bei einer viel niedrigeren Stapeltiefe von 11736 .

Warum haben Lambdas eine geringere maximale Stapeltiefe?

(Kompilieren mit g++ (GCC) 5.4.0 , mit -std=c++14 -Wall )

Beachten Sie auch, dass das Kompilieren mit -O3 optimization praktisch unendliche Rekursionstiefe erlaubt, aber das Lambda endet immer noch bei 25k .

BEARBEITEN : Folgen Sie @Yakk, hier sind die Ergebnisse mit dem Y-Kombinator :

%Vor%

Dies endet bei 4781 und 9221 mit bzw. ohne -O3 .

    
prakharsingh95 26.09.2016, 11:12
quelle

1 Antwort

5

std-Funktion bedeutet nicht dasselbe wie lambda. Eine Std-Funktion ist ein Objekt, das einige Lambdas speichern kann, oder ein Funktionszeiger oder ein Zeiger auf Elementfunktion oder ein Zeiger auf Elementdaten oder fast jedes Objekt, das Operator () kompatibel überschreibt.

Wenn Sie ein Lambda innerhalb einer Std-Funktion speichern, entsteht ein gewisser Mehraufwand. Nicht viel, aber einige. Ein Teil dieses Overheads kann dazu führen, dass der Stack mehr verwendet wird (und der Overhead in nicht optimierten Builds größer ist).

Sie können direkt mit einem Lambda rekrutieren, indem Sie den y-Kombinator verwenden, aber selbst dort werden Sie einen reference-to-self als Parameter, und wenn die Rekursion nicht vom Optimierer eliminiert wird, wird wahrscheinlich mehr Stack verwendet. (Ein hoch optimierter Optimierer könnte bemerken, dass ein stateless Lambda-Referenzargument eliminiert werden könnte, aber das scheint schwierig zu funktionieren).

    
Yakk 26.09.2016, 11:23
quelle

Tags und Links