質問

私たちの心の中にしか書Cコードの並べ替えの配列構造体を用いquicksortとカスタムコンパレータ機能を決定するために商品を発送致します。

最初に書いたものの呼び出しコンパレータ機能のハードコーディングのquicksortます。そのと思い込んで寝にその関数の引数として汎用quicksortます。

私のオリジナルコース、宣言したが、コンパレータ機能 inline.私の新しいコードいたの inline 宣言もなう、その機能とパラメータとして渡された.しかし、コンパイラなかったらエレベータが古風な柵式の!

私の質問はは inline 宣言を有す影響ここでは、それとも単なる勧告へのコンパイラであるか。

独自のコード:

typedef struct _CGRect {
    CGPoint origin;
    CGSize size;
} CGRect;

typedef enum _NSComparisonResult {
     NSOrderedAscending = -1,
     NSOrderedSame,
     NSOrderedDescending
} NSComparisonResult;

static inline NSComparisonResult CGRectCompareRowsFirst(CGRect r1, CGRect r2)
{
    if (r1.origin.y < r2.origin.y)
        return NSOrderedAscending;
    else if (r1.origin.y > r2.origin.y)
        return NSOrderedDescending;
    else
    {
        if (r1.origin.x < r2.origin.x)
            return NSOrderedAscending;
        else if (r1.origin.x > r2.origin.x)
            return NSOrderedDescending;
        else
            return NSOrderedSame;
    }
}

static void CGRectQuicksortRowsFirst(CGRect *left, CGRect *right)
{
    if (right > left) {
        CGRect pivot = left[(right-left)/2];
        CGRect *r = right, *l = left;
        do {
            while (CGRectCompareRowsFirst(*l, pivot) == NSOrderedAscending) l++;
            while (CGRectCompareRowsFirst(*r, pivot) == NSOrderedDescending) r--;
            if (l <= r) {
                CGRect t = *l;
                *l++ = *r;
                *r-- = t;
            }
        } while (l <= r);
        CGRectQuicksortRowsFirst(left, r);
        CGRectQuicksortRowsFirst(l, right);
    }
}

static void CGRectSortRowsFirst(CGRect *array, int length)
{
    CGRectQuicksortRowsFirst(array, array+length-1);
}

新しいコード:

static inline NSComparisonResult CGRectCompareRowsFirst(const void *s1, const void *s2)
{
    CGRect r1 = *(CGRect *)s1, r2 = *(CGRect *)s2;

    if (r1.origin.y < r2.origin.y)
        return NSOrderedAscending;
    else if (r1.origin.y > r2.origin.y)
        return NSOrderedDescending;
    else
    {
        if (r1.origin.x < r2.origin.x)
            return NSOrderedAscending;
        else if (r1.origin.x > r2.origin.x)
            return NSOrderedDescending;
        else
            return NSOrderedSame;
    }
}

static void quick(CGRect *left, CGRect *right, NSComparisonResult(*f)(const void *, const void *))
{
    if (right > left) {
        CGRect pivot = left[(right-left)/2];
        CGRect *r = right, *l = left;
        do {
            while (f(&*l, &pivot) == NSOrderedAscending) l++;
            while (f(&*r, &pivot) == NSOrderedDescending) r--;
            if (l <= r) {
                CGRect t = *l;
                *l++ = *r;
                *r-- = t;
            }
        } while (l <= r);
        quick(left, r, f);
        quick(l, right, f);
    }
}

static void CGRectSortRowsFirst(CGRect *array, int length)
{
    quick(array, array+length-1, CGRectCompareRowsFirst);
}
役に立ちましたか?

解決

インラインでの推奨をコンパイラ、かっこは無視できます。これが起こるのにはいくつかの理由などの機能が複雑すぎる安全にinlined.合格でのパラメータとしての機能を上記のような、コンパイラの作成には非inlined版者アドレスに渡される機能です。

このコンパイラまだまだ十分とはいえませんがインラインの機能例えば、コード生成コンパイラを使用することがありますのインライン機能にヒントを差し替えを利用して通話機能へのポインタを拡大し機能なしいる場合、現在のコンパイラがいます。

Inlined非inlinedバージョンでやることが多くな社内の集ます。

他のヒント

のインライン'キーワードでコンパイラフラグを変えて取り扱いと異なることでコピー本体の機能と置き換えると、実際に機能する。この性能を向上させていれば小さな機能を取得する再利用の多くの箇所にコードです。こころのものに使用しaccessorsおよび修飾子となります。このケースでは思いますのでお任せします。まあそんでいることになる。に差がないたしますのでご連絡ください

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top