Gibt es eine Möglichkeit std::function
in gcc zu verhindern, dynamisch Speicher für größere Funktionsobjekte Zuweisung?Prevent std :: Funktion in gcc aus dem Speicher oder Erhöhung Schwellen
Ich hätte den folgenden Code erwartet ohne dynamische Zuordnung zu arbeiten:
#include <functional>
#include <iostream>
// replace operator new and delete to log allocations
void* operator new (std::size_t n) {
std::cout << "Allocating " << n << " bytes" << std::endl;
return malloc(n);
}
void operator delete(void* p) throw() {
free(p);
}
class TestPlate
{
private:
int value;
public:
int getValue(){ return value; }
void setValue(int newValue) { value = newValue; }
int doStuff(const std::function<int()>& stuff) { return stuff(); }
};
int main()
{
TestPlate testor;
testor.setValue(15);
const std::function<int()>& func = std::bind(&TestPlate::getValue, &testor);
std::cout << testor.doStuff(func) << std::endl;
testor.setValue(25);
std::cout << testor.doStuff(func) << std::endl;
}
jedoch es 24 Byte zuweist. Soweit ich das beurteilen kann, benötigt der Zeiger auf die Methode 16 Bytes und der Zeiger auf die Klasseninstanz weitere 8 Bytes. Dies scheint entweder A größer als der interne Speicher für das Funktionsobjekt oder B ein einfacher Bug zu sein.
Ich frage mich, ob es eine Möglichkeit gibt, diese Art von Verhalten zu umgehen, ohne die Signatur des std::function
zu ändern oder eine Menge zusätzlichen Wrapper-Code zu erstellen.
Standard legt fest, dass _Implementations gefördert werden, um die Verwendung von dynamisch zugewiesenen Speichern für kleine aufrufbare Objekte zu vermeiden, zum Beispiel, wobei f ein Objekt zu halten. Compiler geben ihr Bestes. Wenn es nicht Ihren Bedürfnissen passt, gut ... – skypjack
Klirren + libC++ zuteilt keine Speicher in Ihrem Beispiel (http://coliru.stacked-crooked.com/a/52505806440111db) – Praetorian