Clippy lints / Performance
Clippy lint · Performance · checked with Clippy 0.1.99
clippy::vec_init_then_push: calls to `push` immediately after creation
What it meansChecks for calls to push immediately after creating a new Vec. If the Vec is created using with_capacity this will only lint if the capacity is a constant and the number of pushes is greater than or equal to the initial capacity. If the Vec is extended after the initial sequence of pushes and it was default initialized then this will only lint after there were at least four pushes. This number may change in the future. It is in the performance group and warns by default.
What you see
warning: calls to `push` immediately after creation --> main.rs:3:1 | 3 | / let mut v = Vec::new(); 4 | | v.push(0); 5 | | v.push(1); 6 | | v.push(2); | |__________^ help: consider using the `vec![]` macro: `let v = vec![..];` | = help: for further information visit https://rust-lang.github.io/rust-clippy/stable/index.html#vec_init_then_push = note: `#[warn(clippy::vec_init_then_push)]` on by default
Real output of Clippy 0.1.99 (Rust 1.99) on the example below. Names and line numbers in yours will differ.
Does it matter?
The vec![] macro is both more performant and easier to read than multiple push calls.
Code that could be written to run faster. Warns by default.
How to fix it
Clippy does not fix this one automatically (its suggestion may change behaviour, so it only shows it). Change the code by hand:
Flagged
let mut v = Vec::new();
v.push(0);
v.push(1);
v.push(2);
Write this instead
let v = vec![0, 1, 2];
Turn it off, or on
Allow it where it does not fit your code, as narrowly as you can:
On one item
#[allow(clippy::vec_init_then_push)]
fn my_function() { /* ... */ }Whole crate (Cargo.toml)
[lints.clippy]
vec_init_then_push = "allow"One run
cargo clippy -- -A clippy::vec-init-then-pushThe [lints] table needs Rust 1.74 or newer. In a workspace, put it under [workspace.lints.clippy] and add [lints] workspace = true to each member.
Clippy's own documentation
What it does
Checks for calls to push immediately after creating a new Vec.
If the Vec is created using with_capacity this will only lint if the capacity is a
constant and the number of pushes is greater than or equal to the initial capacity.
If the Vec is extended after the initial sequence of pushes and it was default initialized
then this will only lint after there were at least four pushes. This number may change in
the future.
Why is this bad?
The vec![] macro is both more performant and easier to read than
multiple push calls.
Example
let mut v = Vec::new();
v.push(0);
v.push(1);
v.push(2);
Use instead:
let v = vec![0, 1, 2];
From the Clippy lint list (0.1.99), part of the Rust project, MIT or Apache-2.0. Official entry.
Related lints
- large_enum_variantlarge size difference between variants
- unnecessary_to_ownedunnecessary use of `to_string`
- useless_borrows_in_formattingredundant reference in `println!` argument
- useless_vecuseless use of `vec!`
- waker_clone_wakeChecks for usage of waker.clone().wake()
All 847 Clippy lints · Rust compiler errors · Cargo.toml checker
Up next
Related lintclippy::large_enum_variantlarge size difference between variantsRead it next →Did this answer your question?