https://gcc.gnu.org/bugzilla/show_bug.cgi?id=119292
Bug ID: 119292 Summary: code deduplication in case of throw (improvement) Product: gcc Version: 15.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: federico at kircheis dot it Target Milestone: --- Consider following snippet ~~~~ struct myclass{ myclass(int i); }; #ifdef THROWIT [[noreturn]] __attribute__((noinline)) void throwit(int i){ throw myclass(i); } #define THROW(p) throwit(p); #else #define THROW(p) throw myclass(p); #endif void foo(){ THROW(41); } void bar(int j){ THROW(j); } ~~~~ https://godbolt.org/z/ja1azahe4 When writing "throw" directly, "a lot" of code is generated in the body of bar and foo which is identical, which in turn generate a bigger binary. When wrapping the throw in a non-inline function, this duplication does not happen, and since throwing is not cheap (__cxa_allocate_exception allocates), the cost of having a non-inline function should be small. Does GCC have any option (or chance) for avoiding to wrap all "throw" in functions to reduce the size of the binary?