4

我希望这不是问题本身的重复,但是搜索词是如此模棱两可,我想不出更好的了。

无论如何,假设我们有两个类:

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

和其他地方

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

从实际的角度来看,它们是相同的,那么编译器是否将它们都视为某种类型定义?还是会产生两个独立的代码单元?

我很好奇,因为我想超越 typedef 并制作一些类型的变体以提高可读性。我不想要不必要的重复,虽然......

干杯!

4

6 回答 6

2

就编译器而言,它们是完全不相关的类。

如果它们只是 POD C-structs,它实际上不会为它们生成任何真正的代码。(是的,有一个静默赋值运算符和一些其他功能,但我怀疑是否会有实际编译的代码来执行它,如果使用它们只会内联它们)。

于 2011-03-02T17:21:02.633 回答
2

由于您用作示例的类仅在编译期间相关,因此无需复制或折叠。运行时,成员变量被简单地作为“偏移 N 处的值”访问。

于 2011-03-02T17:21:03.473 回答
2

当然,这在很大程度上是特定于实现的。

这里的任何内部崩溃都将完全在编译器机制内部,并且不会对生成的翻译代码产生影响。

我想这不太可能是这种情况,因为我想不出任何好处以及这会使事情真正复杂化的几种方式。不过,我不能提供任何证据。

于 2011-03-02T17:21:30.353 回答
2

这完全是特定于实现的。

例如,我可以使用 CLang / LLVM 同时说明这两种观点:

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

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

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

于 2011-03-02T18:07:44.827 回答
1

不,因为它们实际上是两种不同的类型。编译器必须以这种方式对待它们。没有魔法合并正在进行。

于 2011-03-02T17:20:52.103 回答
1

不,它们不被视为 typedef,因为它们是不同的类型,例如可以用于重载函数。

另一方面,这些类型中没有代码,因此没有什么可复制的。

于 2011-03-02T17:27:45.500 回答