W swoim przemówieniu "Efficiency with algorithms, Performance with data structures", Chandler Carruth mówi o potrzebie lepszego modelu przydziału w C++. Bieżący model alokatora atakuje system typów i sprawia, że prawie niemożliwe jest działanie w wielu projektach z tego powodu. Z drugiej strony, Bloomberg allocator model nie atakuje systemu typów, ale jest oparty na wywołaniach funkcji wirtualnych, co uniemożliwia kompilatorowi "obejrzenie" alokacji i jej optymalizację. W swojej rozmowie opowiada o kompilatorach deduplikujących alokację pamięci (1:06:47).Alokacja pamięci zoptymalizowana przez kompilatory
Zajęło mi trochę czasu, aby znaleźć przykłady optymalizacji alokacji pamięci, ale znalazłem ten przykład kodu, który skompilowany pod klangiem, zoptymalizować całą alokację pamięci i po prostu zwrócić 1000000 bez przydzielania czegokolwiek.
template<typename T>
T* create() { return new T(); }
int main() {
auto result = 0;
for (auto i = 0; i < 1000000; ++i) {
result += (create<int>() != nullptr);
}
return result;
}
Poniższy papier http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3664.html mówi również, że alokacja może być sprzężona z kompilatorów i zdaje się sugerować, że niektóre kompilatory już robić tego typu rzeczy.
Ponieważ jestem bardzo zainteresowany strategiami wydajnego przydzielania pamięci, naprawdę chcę zrozumieć, dlaczego Chandler Carruth jest przeciwko wirtualnym połączeniom w modelu Bloomberg. Powyższy przykład wyraźnie pokazuje, że clang optymalizuje rzeczy, gdy widzi przydział.
- chciałbym mieć „prawdziwy kod życia”, gdzie ta optymalizacja jest przydatna i zrobione przez każdego obecnego kompilatora
- Czy masz przykład kodu, w którym inny przydział są skondensowane przez Anu obecnego kompilatora?
- Czy rozumiesz, co Chandler Carruth ma na myśli mówiąc, że kompilatorzy mogą "deduplikować" twoje przydziały w rozmowie o 1:06:47?
Funkcja "create" jest funkcją z efektami ubocznymi czasu wykonywania, kompilator nie może znać wyników tych efektów ubocznych podczas kompilacji. To co * może * zrobić, to zobaczenie, że przydzielona pamięć nie jest nigdzie używana, co może być powodem, dla którego może zoptymalizować alokacje, ale twierdzę, że jest to złe, ponieważ kompilator nie ma możliwości przewidzenia wyników podczas kompilacji -czas. –
@Joachim: Ten przykład został omówiony tutaj http://stackoverflow.com/questions/25668420/clang-vs-gcc-optimization-including-operator-new. Zgodnie z n3664, o którym mowa w moim poście, standard nie jest jednoznaczny lub nie jest dozwolony. Ale wydaje się, że wiele kompilatorów już to robi. – InsideLoop