4

スタック フレームのサイズを返すポータブル関数を C で (アセンブリなしで) 記述します。

int stackframe_size()
{

}

以下のように解決しようとしました - VS 2010 でコンパイルすると、この関数は 228 バイトを返します。その正確性を確認する方法はありますか?

    int stackframe_size(int run)
    {
        int i ;

        if(!run)
        {
            return ((int)(&i) - stackframe_size(++run));

        }
        return (int)(&i);

    }

次のように呼び出されます。

    int main()
    {
        printf("\nSize of stackframe_size() is: %d bytes",stackframe_size(0)) ;
        return 0;
    }
4

2 に答える 2

5

そのようなポータブル機能はありません。

あなたの試みはおそらく可能な限り近いものですが、ポインターの減算には未定義の動作があります。より一般的にp1 - p0は、p0p1は異なるオブジェクトへのポインターであり、未定義の動作をします。

intコードが、アドレスからの変換の結果である値を減算する場合を除きます。ポインターの直接減算が機能する可能性が高く、ポインターはchar*or型である必要がありunsigned char*ます。が小さすぎて変換されたポインターを保持できない実装が多数あります。またint、ポインターが想定よりも複雑な表現を持っている実装もあり、それらを十分に大きな整数型に変換しても、必ずしも意味のある結果が得られるとは限りません。

「スタック フレーム」がプッシュおよびポップされるメモリの連続領域という意味で「スタック」を使用しない実際の C 実装があります。(先入れ後出しのデータ構造という意味で「スタック」が必要ですが、「スタック」の実装方法はまったく指定されていません。)たとえば、一部の IBM メインフレーム実装では、関数にメモリを割り当てます。ヒープのようなものを介して呼び出すため、そのような 2 つの呼び出しのローカル変数のアドレス間に定義された関係はありません。

おそらく、純粋な C (アセンブリ言語なし) で関数を記述して、特定の実装のスタック フレームのサイズを取得できます。しかし、C 言語自体には「スタック フレーム」という概念がないため (標準では「スタック」という言葉さえ使用していません)、移植可能に行うことはできません。

于 2015-02-06T18:41:02.937 に答える