Clippy lints / Pedantic
Clippy lint · Pedantic · checked with Clippy 0.1.99
clippy::large_types_passed_by_value: this argument (2048 byte) is passed by value, but might be more efficient if passed by reference (limit: 256 byte)
What it meansChecks for functions taking arguments by value, where the argument type is Copy and large enough to be worth considering passing by reference. Does not trigger if the function is being exported, because that might induce API breakage, if the parameter is declared as mutable, or if the argument is a self. It is in the pedantic group and off by default.
What you see
warning: this argument (2048 byte) is passed by value, but might be more efficient if passed by reference (limit: 256 byte) --> main.rs:6:11 | 6 | fn foo(v: TooLarge) {} | ^^^^^^^^ help: consider passing by reference instead: `&TooLarge` | = help: for further information visit https://rust-lang.github.io/rust-clippy/stable/index.html#large_types_passed_by_value = note: `-W clippy::large-types-passed-by-value` implied by `-W clippy::pedantic`
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?
Arguments passed by value might result in an unnecessary shallow copy, taking up more space in the stack and requiring a call to memcpy, which can be expensive.
Stricter lints with some false positives. Off by default; opt in with clippy::pedantic.
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
#[derive(Clone, Copy)]
struct TooLarge([u8; 2048]);
fn foo(v: TooLarge) {}
Write this instead
fn foo(v: &TooLarge) {}
Turn it off, or on
It is off by default. To use it, set it to warn or deny:
Whole crate (Cargo.toml)
[lints.clippy]
large_types_passed_by_value = "warn"In code
#![warn(clippy::large_types_passed_by_value)]One run
cargo clippy -- -W clippy::large-types-passed-by-valueThe [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.
Settings in clippy.toml
avoid-breaking-exported-api: Suppress lints whenever the suggested change would cause breakage for other crates.pass-by-value-size-limit: The minimum size (in bytes) to consider a type for passing by reference instead of by value.
Clippy's own documentation
What it does
Checks for functions taking arguments by value, where
the argument type is Copy and large enough to be worth considering
passing by reference. Does not trigger if the function is being exported,
because that might induce API breakage, if the parameter is declared as mutable,
or if the argument is a self.
Why is this bad?
Arguments passed by value might result in an unnecessary
shallow copy, taking up more space in the stack and requiring a call to
memcpy, which can be expensive.
Example
#[derive(Clone, Copy)]
struct TooLarge([u8; 2048]);
fn foo(v: TooLarge) {}
Use instead:
fn foo(v: &TooLarge) {}
Configuration
-
avoid-breaking-exported-api: Suppress lints whenever the suggested change would cause breakage for other crates.(default:
true) -
pass-by-value-size-limit: The minimum size (in bytes) to consider a type for passing by reference instead of by value.(default:
256)
From the Clippy lint list (0.1.99), part of the Rust project, MIT or Apache-2.0. Official entry.
Related lints
- too_many_linesChecks for functions with a large amount of lines
- missing_errors_docChecks the doc comments of publicly visible functions that return a Result type and warns if there is no # Errors section
- must_use_candidateChecks for public functions that have no #[must_use] attribute, but return something not already marked must-use, have no mutable arg and mutate no statics
- large_digit_groupsdigit groups should be smaller
- large_futureslarge future with a size of 16385 bytes
- large_stack_arraysallocating a local array larger than 16384 bytes
- linkedlistChecks for usage of any LinkedList, suggesting to use a Vec or a VecDeque (formerly called RingBuf)
- macro_use_importsChecks for #[macro_use] use
- manual_assertonly a `panic!` in `if`-then statement
All 847 Clippy lints · Rust compiler errors · Cargo.toml checker
Up next
Related lintclippy::too_many_linesChecks for functions with a large amount of linesRead it next →Did this answer your question?