Czy istnieje sposób, aby uniemożliwić std::function
w gcc dynamiczne przydzielanie pamięci dla większych obiektów funkcji?Zapobieganie std :: funkcja w gcc z alokacji pamięci lub zwiększenie threshhold
bym spodziewać następujący kod do pracy bez dynamicznej alokacji:
#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;
}
Jednak przeznacza 24 bajtów. O ile mogę to powiedzieć, to dlatego, że wskaźnik do metody wymaga 16 bajtów, a wskaźnik do instancji klasy kolejne 8 bajtów. Wydaje się, że jest to większa niż pamięć wewnętrzna dostępna dla obiektu funkcji lub B zwykłego błędu.
Zastanawiam się, czy istnieje sposób obejścia tego rodzaju zachowania bez zmiany podpisu std::function
lub tworzenia wielu dodatkowych kodu opakowania.
Standard stwierdza, że _Wnioski są zachęcane do unikania użycia dynamicznie przydzielanej pamięci dla małych obiektów wywoływalnych, na przykład, gdy f jest obiektem zawierającym jedynie wskaźnik lub odniesienie do obiektu i funkcję wskaźnika pointer_. Kompilatory starają się jak najlepiej. Jeśli to nie odpowiada twoim potrzebom, dobrze ... – skypjack
clang + libC++ nie przypisuje żadnej pamięci w twoim przykładzie (http://coliru.stacked-crooked.com/a/52505806440111db) – Praetorian