我想知道在C中是否这样做

void aFunction(Type* pItem){
    Type item = *pItem;
    ...do stuff with item
}


在速度或内存方面,效率不如在函数中始终使用*pItem,即不实例化Type item = *pItem;。还是编译后基本相同?

谢谢

最佳答案

在启用优化功能的情况下调用编译器时,通常会优化它们生成的代码。任何好的编译器都会为在item之后使用Type item = *pItem;的简单例程生成与仅使用*pItem而不将其保存在item中的例程相同的代码。

但是,假设例程并不简单。假设您有:

void aFunction(Type *pItem, Type *qItem)
{
     Type item = *pItem;
     *qItem = SomeValue;
     printf("%Format\n", item);
     printf("%Format\n", *pItem);
}


在这种情况下,编译器无法知道*pItemitem相同,因为pItemqItem可能指向同一对象,因此*qItem = SomeValue可能已更改*pItem。因此,要实现第二个printf,编译器必须在执行*pItem之后加载*qItem = SomeValue

因此,如果您知道Type item = *pItem;pItem始终指向不同的对象,则使用qItem实际上比不创建新的本地对象更好,因为它允许编译器一次加载*pItem并保留如果在整个例程中多次访问*pItem*qItem,则将其存储在处理器寄存器中而不是重新加载它。

在这种情况下,有一种方法可以告诉编译器不会发生这种潜在的指针相等。 restrict限定符将告诉编译器对象pItem指向的对象只能通过pItem指针访问:

void aFunction(restrict Type *pItem, Type *qItem)


但是,通常,这些情况会变得非常复杂。 Type可能是一个包含指向Type类型其他对象的指针的结构。例如,Type可能是一个树节点,其中包含指向子树的成员leftright。在大多数情况下,您应该以清晰的方式编写代码,并让编译器对其进行优化。如果方便的是将*pItem保存在本地对象中并使用它,则可以这样做。随着经验的积累,您将学习更多有关编译器的行为以及如何编写允许编译器进行优化的代码的更多信息。

关于c - C:创建值的新实例是否已经占用空间?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53021804/

10-11 03:25