Files
rust/compiler
bors 503dce33e2 Auto merge of #148789 - m-ou-se:new-fmt-args-alt, r=wafflelapkin,jdonszelmann
New format_args!() and fmt::Arguments implementation

Part of https://github.com/rust-lang/rust/issues/99012

This is a new implementation of `format_args!()` and `fmt::Arguments`. With this implementation, `fmt::Arguments` is only two pointers in size. (Instead of six, before.) This makes it the same size as a `&str` and makes it fit in a register pair.

---

This `fmt::Arguments` can store a `&'static str` _without any indirection_ or additional storage. This means that simple cases like `print_fmt(format_args!("hello"))` are now just as efficient for the caller as `print_str("hello")`, as shown by this example:

> code:
> ```rust
> fn main() {
>     println!("Hello, world!");
> }
> ```
>
> before:
> ```asm
> main:
>  sub     rsp, 56
>  lea     rax, [rip + .Lanon_hello_world]
>  mov     qword ptr [rsp + 8], rax
>  mov     qword ptr [rsp + 16], 1
>  mov     qword ptr [rsp + 24], 8
>  xorps   xmm0, xmm0
>  movups  xmmword ptr [rsp + 32], xmm0
>  lea     rdi, [rsp + 8]
>  call    qword ptr [rip + std::io::stdio::_print]
>  add     rsp, 56
>  ret
> ```
>
> after:
> ```asm
> main:
>  lea     rsi, [rip + .Lanon_hello_world]
>  mov     edi, 29
>  jmp     qword ptr [rip + std::io::stdio::_print]
> ```

(`panic!("Hello, world!");` shows a similar change.)

---

This implementation stores all static information as just a single (byte) string, without any indirection:

> code:
> ```rust
> format_args!("Hello, {name:-^20}!")
> ```
>
> lowering before:
> ```rust
> fmt::Arguments::new_v1_formatted(
>     &["Hello, ", "!\n"],
>     &args,
>     &[
>         Placeholder {
>             position: 0usize,
>             flags: 3355443245u32,
>             precision: format_count::Implied,
>             width: format_count::Is(20u16),
>         },
>     ],
> )
> ```
>
> lowering after:
> ```rust
> fmt::Arguments::new(
>     b"\x07Hello, \xc3-\x00\x00\xc8\x14\x00\x02!\n\x00",
>     &args,
> )
> ```

This saves a ton of pointers and simplifies the expansion significantly, but does mean that individual pieces (e.g. `"Hello, "` and `"!\n"`) cannot be reused. (Those pieces are often smaller than a pointer to them, though, in which case reusing them is useless.)

---

The details of the new representation are documented in [library/core/src/fmt/mod.rs](https://github.com/m-ou-se/rust/blob/new-fmt-args-alt/library/core/src/fmt/mod.rs#L609-L712).
2025-11-12 23:21:24 +00:00
..
2025-11-11 20:16:15 +01:00
2025-10-12 08:08:30 +00:00
2025-09-26 17:53:49 +02:00
2025-11-11 18:55:40 -05:00
2025-11-11 18:55:40 -05:00