c++ 编译器是否折叠结构相同的类?

jvidinwx  于 2022-11-27  发布在  其他
关注(0)|答案(6)|浏览(221)

我希望这不是一个问题本身的重复,但搜索词是如此模棱两可,我想不出更好的。
假设我们有两个类:

class FloatRect
{
 float x,y,width,height;
};

还有别的地方

class FloatBox
{
 float top,left,bottom,right;
};

从实际的Angular 来看,它们是相同的,那么编译器是否将它们都视为某种类型的typedef?
还是会产生两个独立的代码单元?
我很好奇,因为我想超越typedef,创建一些类型的变体来提高可读性。
但我不想重复。

vh0rcniy

vh0rcniy1#

这完全取决于具体实现。
例如,我可以使用CLang / LLVM来同时说明这两个观点:

  • CLang是C++前端,它使用两种不同的类型来解析函数调用等...并将它们视为完全不同的值
  • LLVM是优化器的后端,它不关心名称,而只关心结构表示,因此将它们折叠成一个类型......如果没有用,甚至完全删除时间定义。

如果问题是关于:引入类似布局的类是否会产生开销,那么答案是,所以编写您需要的类。

  • 注意:函数也是如此,即优化器可以合并相同的函数块以获得更紧凑的代码,但这不是复制/粘贴的原因 *
lokaqttq

lokaqttq2#

它们是与编译器完全无关的类。
如果它们只是POD C结构体,它实际上不会为它们生成任何真实的的代码。(是的,有一个无声的赋值运算符和一些其他函数,但我怀疑是否会有代码实际编译来做这件事,如果使用它们,它只会内联它们)。

cqoc49vn

cqoc49vn3#

由于用作示例的类只在编译时相关,所以没有什么可复制或折叠的。运行时,成员变量只作为“在偏移量N处的值”访问。

j8yoct9x

j8yoct9x4#

当然,这与具体的实现有很大的关系。
这里的任何内部崩溃都将完全是编译器机制的内部崩溃,并且不会对生成的已翻译代码产生影响。
我想这是不太可能的,因为我能想到没有任何好处,并在几个方面,这将真正复杂的事情。

p1tboqfb

p1tboqfb5#

不,因为它们实际上是两种不同的类型。编译器必须以这种方式处理它们。不存在神奇的合并。

gmxoilav

gmxoilav6#

不,它们不被视为typedef,因为它们是不同的类型,例如可以用于重载函数。
另一方面,类型中没有代码,因此没有可复制的内容。

相关问题