を逆アセンブル、逆アセンブル、逆アセンブル...
コードの行に応じて、あなたはそれが可能である私たちに表示されませんあなたのポインタが多少静的であれば、良いコンパイラはそれを知っていて、両方のアドレスをあらかじめ計算しておくでしょう。あなたが最適化をしていなければ、この全体的な議論はミュートです。また、使用しているプロセッサーによって異なりますが、どちらもプロセッサーに応じて1つの命令で実行できます。だから私は、基本的な最適化の手順に従います。
1)一番下の行は、それが2つの命令の場合の代わりに、単一クロックの原価計算であってもよいですが、上述したように実行
)時間を分解し、 2を調べますあなたは決して見えないだろう。コンパイラとオプティマイザの選択肢の品質は、パフォーマンスを向上させるためにコードの1行を微調整しようとするよりもはるかに劇的なパフォーマンスの違いになります。コンパイラを切り替えることで、どちらの方向にも10〜20%、場合によってはそれ以上のものが得られます。最適化フラグを変更することができますが、すべての処理を行わないとコードが最速になります。-O1は-O3よりも優れていることがあります。コードの生産とどのようにこれらの2行は、高レベルの言語からのパフォーマンスを最大化するためにどのような理解
は
異なるプロセッサ用にコンパイルすると、様々なコンパイラを使用して分解するから来ています。さらに重要なことは、問題の行のコードは、コンパイラがそのセグメントをどのように最適化するかに大きな役割を果たします。 GCC(ないその偉大コンパイラ)で
typedef struct
{
unsigned int first;
unsigned int second;
} dataStruct;
dataStruct data;
int main()
{
dataStruct *pData = &data;
data.first = 9;
pData->second = 10;
return(0);
}
あなたが得る:この質問に誰かの例を使用して
mov r2, #10
mov r1, #9
stmia r3, {r1, r2}
Cコードのだから、両方の行を1つのストアに結合され、ここでの問題は、テストとして使用される例です。二つの別々の機能が少し良くなっているだろうが、それはそれの周りに多くのコードを必要とし、ポインタがオプティマイザのdoesntのようにいくつかの他のメモリを指す必要があります内のアドレスを渡す必要があり、これをテストするために、それは静的なグローバルアドレスで実現コンパイラ(よくgcc)は静的アドレスであることを理解できません。
またはNO最適化、同じコード、同じコンパイラ、ポインタと直接間に差を有します。
mov r3, #9
str r3, [r2, #0]
mov r3, #10
str r3, [r2, #4]
これはコンパイラとプロセッサによって表示されることが予想されるものですが、違いはありません。このプロセッサでは、たとえテストコードが関数からポインタの静的アドレスを隠していたとしても、それはまだ2つの命令に沸きます。構造体要素に格納されている値がすでにレジスタにロードされている場合は、way、pointerまたはdirectのいずれかの命令になります。
だからあなたの質問への答えは絶対的ではありません...場合によります。分解してテストしてください。
ポインタは、直接アクセスでは何を提供しますか?ポインタが遅いです。 –
-1は、最初にベンチマークすることなくマイクロ最適化について質問します。 – bk1e