C:铸造新的结构VS铸造给定结构

问题描述:

我的问题很简单,这是否C:铸造新的结构VS铸造给定结构

typedef struct {a;b;c;d;}bar; 
((bar*)ANOTHERSTRUCTPOINTER)->a=1; 
((bar*)ANOTHERSTRUCTPOINTER2)->a=1; 
//<...> 
((bar*)ANOTHERSTRUCTPOINTERn)->a=1; 

具有相同的执行时间呢?

((struct {a;b;c;d;}*)ANOTHERSTRUCTPOINTER)->a=1; 
((struct {a;b;c;d;}*)ANOTHERSTRUCTPOINTER2)->a=1; 
//<...> 
((struct {a;b;c;d;}*)ANOTHERSTRUCTPOINTERn)->a=1; 

请记住这只是一个例子,所以不要质疑其实我并没有使用数组

是的,他们指的是同样的事情,应该编译成相同的可执行代码。

+0

我所知道的是,他们做同样的事情,但我还是有疑问,因为在第一个结构只定义一次,而在第二个它在每一个塑像的定义(或者所以它看起来像对我来说,这就是为什么我问) –

+1

你是正确的结构每次重新定义,但这发生在编译时,而不是运行时。在运行时,结构的“字段”仅由编译器对其起始地址进行硬编码(偏移)。 – Wyzard

+1

我想我应该补充一点,这个答案在技术上是特定于平台的,并且不是由C标准保证的 - 原则上,您可能会使用一个在运行时解析源代码的C解释器,在这种情况下,重复的结构定义可能需要额外的工作。但实际上,每个人都将C编译为机器码,并且编译器将结构字段解析为固定的偏移量。 – Wyzard