C指针与结构的直接成员访问

Ale*_*all 10 c embedded pointers global micro-optimization

假设我有一个类似以下的结构......

typedef struct {
  int WheelCount;
  double MaxSpeed;
} Vehicle;
Run Code Online (Sandbox Code Playgroud)

...我有一个这种类型的全局变量(我很清楚全局变量的缺陷,这是一个嵌入式系统,我没有设计,为此他们是一个不幸但必要的邪恶. )直接或通过指针访问结构成员是否更快?即

double LocalSpeed = MyGlobal.MaxSpeed;
Run Code Online (Sandbox Code Playgroud)

要么

double LocalSpeed = pMyGlobal->MaxSpeed;
Run Code Online (Sandbox Code Playgroud)

我的任务之一是简化和修复最近继承的嵌入式系统.

Ree*_*sey 20

一般来说,我会说第一个选择:

double LocalSpeed = MyGlobal.MaxSpeed;
Run Code Online (Sandbox Code Playgroud)

这有一个较少的解引用(你没有找到指针,然后取消引用它来到达它的位置).它也更简单,更易于阅读和维护,因为除了struct之外,您不需要创建指针变量.

话虽如此,我认为即使在嵌入式系统上,您看到的任何性能差异都不会显着.两者都是非常非常快的访问时间.

  • 我在这里和里德在一起。直接引用更安全,不需要 NULL 检查,并且节省了取消引用操作。无论如何都必须访问变量的内存内容,所以为什么要进行额外的查找。如果您已经可以直接访问该变量,则指针将一无所获。 (2认同)
  • 除非体系结构和编译器完全是脑死亡,否则直接访问将*最差*相同.最有可能的是,MyGlobal将变成一个静态地址.在最坏的情况下,编译器将使用指向全局的指针. (2认同)

Iva*_*van 8

第一个应该更快,因为它不需要指针解除引用.那么对于基于x86的系统来说也是如此,对其他人来说并不确定.

在x86上,第一个会翻译成这样的东西

mov eax, [address of MyGlobal.MaxSpeed]
Run Code Online (Sandbox Code Playgroud)

而第二个就是这样的

mov ebx, [address of pMyGlobal] 
mov eax, [ebx+sizeof(int)] 
Run Code Online (Sandbox Code Playgroud)