On 2025/01/31 17:05, Jonathan Wakely wrote:
On Fri, 31 Jan 2025, 06:50 The Cuthour via Gcc, <gcc@gcc.gnu.org
<mailto:gcc@gcc.gnu.org>> wrote:
Suppose we have the following two classes:
=== Vec.h ===
class Vec {
int x, y, z;
};
=== end Vec.h ===
=== Pix.h ===
class Pix: Vec {
int r, g, b;
};
=== end Pix.h ===
If we add or remove a member variable in class Vec, it requires
recompiling not only Vec.cc but also Pix.cc. I believe this is
a problem. Pix.o should be relinkable.
To solve this problem, I propose the Linkable struct. The term
Linkable struct is proposed in analogy to Linkable function.
C language can be considered a language of Linkable functions.
C language enhances the relinkability of functions by
compromising the optimization of inline functions. C language
does not need Linkable structs because structures are declared
individually in C. Object-oriented languages need Linkable
structs because classes (structures) are described as
differences from their base classes.
To achieve Linkable structs, I propose the Linkable constant.
This mechanism ensures that certain constants are determined
at link time and is realized by extending the ELF format. The
offsets of structure members are defined in a distributed
manner across object files using these constants, with their
values resolved at link time. The information for calculating
these constants is ideally stored in each object file in
Reverse Polish Notation (RPN) for each symbol. The Linkable
constant is also a compromise concerning the optimization of
inline access to structure members.
It also means that sizeof(Pix) is no longer a constant expression, which
breaks the rules of the C++ language.
Imagine that Pix.cc contains:
static_assert(sizeof (Pix) <= 12);
The assertion passes when you compile it, but becomes invalid if you
don't recompile after changing Vec.h
This is not feasible.
I believe that sizeof(Pix) is also a linkable constant. It is a
constant, and its value is determined at link time.