2011-03-02 82 views
4

我希望这不是一个问题本身的重复,但搜索条件是如此含糊不清,我想不出任何更好的。编译器是否会折叠它们的结构中相同的类?

无论如何,让我们说我们有两大类:

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

和其他地方

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

从实用的角度来看,它们是相同的,所以没有编译器把他们都因为一些sortdef? 或者它会产生两个单独的代码单元?

我很好奇,因为我想超越typedefs并且为了提高可读性而创建一些类型的变体。 我不想不必要的重复,但...

干杯!

+2

使用这两种编译一些代码类,并且在结果中不会有任何类似于类或对象的东西...... – delnan 2011-03-02 17:20:38

+0

@delnan:我认为他的意思是内部的编译器,而不是内部的结果代码(当然,类类型没有更长存在)。 – 2011-03-02 17:23:25

+0

我对此表示歉意,我的措辞很糟糕,但我主要想知道输出的代码是否会有重复,但现在这两种情况都已被覆盖。最终代码==内存偏移量,编译器==两种不同类型。谢谢! – Erius 2011-03-02 17:31:48

回答

2

这是完全实现特定的。

例如我可以使用铛/ LLVM来说明一次两个视点:

  • 铛是C++的前端,它使用两种不同类型的解决函数调用等...和治疗他们作为完全不同的值
  • LLVM是优化器的后端,它不关心(还)关于名称,但只是结构表示,因此将它们折叠成单一类型......或甚至完全删除时间定义if无用。

如果问题是关于:不会引入一个类似的布局的类创建开销,那么答案是不,所以写你所需要的课程。

注:同样的情况对于功能,即优化器可以合并的配置完全相同获得更紧凑的代码的功能块,这是不是一个理由复制/粘贴虽然

1

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

+0

那么,你的意思是“不”? – 2011-03-02 17:21:47

+0

好点。谢谢。 – EvilTeach 2011-03-02 17:24:14

+0

错误,llvm在内部合并它们。 – 2011-03-02 18:00:43

2

它们与编译器完全无关。

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

+0

对于每一个编译器?你可以保证这一点? – 2011-03-02 17:22:56

+1

@Tomalak:你无法保证*程序在编译过程中会发生什么。该标准仅描述了输入的外观以及程序在运行时的行为(加上编译器必须/应该提供的某些诊断,如果我没有记错的话)。 – delnan 2011-03-02 17:26:45

+0

@delnan:正确。 :)我的问题是修辞,因为实际上CashCow不能保证他的答案是正确的。 – 2011-03-02 17:31:06

2

由于您用作样本的类仅在编译期间相关,因此没有任何内容可以复制或折叠。运行时,成员变量可以简单地作为“偏移N处的值”来访问。

+0

我认为OP意味着编译器内部,而不是内部的输出代码。 – 2011-03-02 17:22:10

2

这当然是非常具体的实现。

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

我会想象这是不太可能的,因为我可以想到没有任何好处和几种方法,这会使事情变得复杂。但我不能提供任何证据。

+0

@downvoter:请发表评论 – 2011-03-02 17:54:49

1

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

另一方面,这些类型没有代码,所以没有任何东西可以复制。

相关问题