2

C++ ネイティブ コードの ARM アセンブリ コードを見ています。ターゲット プラットフォームは Windows Phone 8、ビルド環境は Visual Studio 2012 です。

ARM アセンブリ コードを調べて、コードを最大限に最適化できる可能性を探しています。

以下のように、ARM コードの命令の 1 つの要件について混乱しています。

C++ コード:

double lmean= kseedsl[n];

アームコード:

1: ldr r3,[sp,#0x4C]
2: ldr r3,[r3]                     // r3= kseedsl
3: add r2,r3,r6,lsl #3             // r2 = &kseedsl[n] (r6 has value of "n")
4: vldr d13,[r2]                   // d13 = *(r2)

kseedsl(関数の入力引数)などの変数のアドレスがスタックに格納されていることは理解しています。しかしldr、アドレスkseedslを r3 にロードするために 2 つ (line1, 2) が必要な理由がわかりません。[sp,#0x4C]私の知る限り、関数の引数として渡される kseedsl のアドレスを直接保存することを期待していました。

ここで私が見逃していることを親切に指摘してください。私が知らない標準的な概念であることを期待しています。

編集:関数のスケルトンは次のとおりです。

void function_xyz(
    vector<double>&             kseedsl,
    vector<double>&             kseedsa,
    vector<double>&             kseedsb,
    vector<int>&                kseedsx,
    vector<int>&                kseedsy,
    unsigned short*             klabels,
    const int&                  STEP,
    const double&               M,
    int                         Iter,
    int                         *oMaxSegsize);
4

2 に答える 2

2

kseedslは であるためstd::vector<double>&、ベクトルに含まれる実際のデータを取得するには、2 つのロード命令が必要です。

最初のロード命令は、std::vectorオブジェクト自体の場所を r3 にロードします。
2 番目のロード命令は、 によって管理されるデータ領域のアドレスをロードしますstd::vector。これは、実装の最初のメンバーに保存されstd::vectorます。

于 2013-05-22T08:24:12.963 に答える