拆机、拆机、拆机……
根据您没有向我们展示的代码行,如果您的指针有些静态,一个好的编译器可能会知道这一点并预先计算两者的地址。如果您没有优化,那么整个讨论都是无声的。它还取决于您使用的处理器,两者都可以使用一条指令执行,具体取决于处理器。所以我遵循基本的优化步骤:
1) 反汇编和检查 2) 计时执行
如上所述,尽管底线可能是两条指令的情况,而不是一条花费您可能永远不会看到的单个时钟周期的情况。你的编译器和优化器选择的质量将比试图调整一行代码以提高性能产生更大的性能差异。切换编译器可以在任一方向为您提供 10-20% 的收益,有时甚至更多。就像改变你的优化标志一样,打开所有东西并不能生成最快的代码,有时 -O1 比 -O3 执行得更好。
了解这两行代码产生了什么以及如何最大限度地提高高级语言的性能来自于为不同的处理器编译和使用各种编译器进行反汇编。更重要的是,有问题的行周围的代码在编译器如何优化该段方面发挥着重要作用。
在这个问题上使用别人的例子:
typedef struct
{
unsigned int first;
unsigned int second;
} dataStruct;
dataStruct data;
int main()
{
dataStruct *pData = &data;
data.first = 9;
pData->second = 10;
return(0);
}
使用 gcc(不是那么好的编译器),您将获得:
mov r2, #10
mov r1, #9
stmia r3, {r1, r2}
所以两行 C 代码合并到一个存储中,这里的问题是用作测试的示例。两个单独的函数会更好一些,但是它需要更多的代码,并且指针需要指向其他一些内存,所以优化器没有意识到它是一个静态全局地址,要测试这个你需要传递地址因此编译器(以及 gcc)无法确定它是静态地址。
或者没有优化,相同的代码,相同的编译器,指针和直接之间没有区别。
mov r3, #9
str r3, [r2, #0]
mov r3, #10
str r3, [r2, #4]
根据编译器和处理器,这是您期望看到的,可能没有区别。对于这个处理器,即使测试代码从函数中隐藏了指针的静态地址,它仍然可以归结为两条指令。如果存储在结构元素中的值已经加载到寄存器中,那么它将是一条指令,无论是指针还是直接指令。
所以你的问题的答案不是绝对的......这取决于。拆卸和测试。