Każdy kto pisze w Rust szybko trafia na Vec.
Tworząc wektor przez Vec::new() można by się spodziewać, że gdzieś w tle wywołuje się malloc.
Sprawdziłem — nie wywołuje.
Zajrzałem do źródeł żeby zrozumieć dlaczego.
Vec::new()
Przyjrzyjmy się poniższemu listingowi:
| |
Wynikowa wartość którą otrzymujemy to:
| |
Jaką drogę przebył nasz kod? Spróbujmy zdebugować runtime Rusta!

Wiemy gdzie nasza funkcja docelowo ląduje — a kod źródłowy prezentuje się tak: Vec::new_in na GitHubie
| |

Powyższy kod już po komentarzu pokazuje zasadę której hołduje — Zero Cost Abstractions.
Rust inicjalizując wektor robi to najmniejszym kosztem: przygotowuje dangling pointer (doc) (ptr: 0x4), ale faktycznie bez potrzeby nie alokuje pamięci.
Zatem zmodyfikujmy nasz program, dodajmy element i zobaczmy co się zmieni:
| |
Output:
| |
Jak widać, dopiero po push faktycznie została przydzielona pamięć.
Z tego krótkiego artykułu udało nam się dowiedzieć, że Vec::new() to przykład filozofii Rusta — płacisz tylko za to czego używasz. (zero-cost abstractions)

