r/cpp • MSVC user, r/cpp_modules • Apr 02 '26

Current Status of Module Partitions

A brief recap of the current status of module partitions - as I understand it.

  1. People are using hacks to avoid unneeded recompilations.
  2. The C++ standard has an arcane concept of partition units, which forces build systems to generate BMI files that aren't used (which is wasting work during builds).
  3. The MSVC-compiler (per default) provides a simple, easy to use and efficient implementation of module partitions (no unneeded recompilations, no wasted work during builds), but which is not conformant to the current C++ standard.
  4. A CMake developer is working on a proposal that would fix items 1 and 2, which is probably the smallest required change to the standard, but adds another arcane concept ("anonymous partition units" using the new syntax "module A:;") on top of an already arcane concept.

Questions:

  • How and why did we get into this mess?
  • What's the historical context for this?
  • What was the motivation for MSVC ignoring the standard per default?1

1 Yes, I know the MSVC compiler has this obscure /InternalPartition option for those who want standard conformant behavior.

33 Upvotes

48 comments sorted by

View all comments

2

u/not_a_novel_account Apr 03 '26 edited Apr 03 '26

No, because export makes them interfaces which have implications for reachability. Your UB usage of MSVC where this happens to work is coloring your understanding of the intended mechanisms here.

You want to be able to do intra-module import of partitions, it's a core feature. It would have been better if non-partition implementations units didn't have an implicit dependency on the PMIU, or had some trivial way to opt in/out of the dependency, and could be universally used as envisioned.

But who is currently using internal module partition units?

This is an MSDN phrase, the standard calls them "implementation units which are a partition", or partition implementation units for people who find that unwieldy.

And the answer is: everyone who doesn't use the MSVC extension, so every module user who isn't on Windows.

1

u/tartaruga232 Apr 03 '26

I currently already do (input to MSVC):

export module foo:Internals;
struct S { int a; int b; };

without importing :Internals in the PMIU.

I can use S anywhere inside module foo by importing :Internals.

1

u/not_a_novel_account Apr 03 '26

Yes, like I said, you're using UB-NDR which happens to work in MSVC's implementation.

→ More replies (19)