帮忙举个类型限定词restrict的例子!!

大婶不是大神 发布于 2015/02/05 15:11
阅读 128
收藏 0

帮忙举个类型限定词restrict的例子!!

哪位大神能给个例子 短点的代码,我自己写不出来。

以下是话题补充:

@大婶不是大神:补充下是C语言的例子 (2015/02/05 15:12)
加载中
0
中山野鬼
中山野鬼

哈,不好意思,特地做了些实验,但是我用我的编译器没试出来。

c标准的例子你可以使用别的编译器测试一下。c11的标准的截图如下:


我的编译器版本如下:

Apple LLVM version 5.1 (clang-503.0.40) (based on LLVM 3.4svn)

Target: x86_64-apple-darwin13.3.0

Thread model: posix

0
大婶不是大神

引用来自“中山野鬼”的评论

哈,不好意思,特地做了些实验,但是我用我的编译器没试出来。

c标准的例子你可以使用别的编译器测试一下。c11的标准的截图如下:


我的编译器版本如下:

Apple LLVM version 5.1 (clang-503.0.40) (based on LLVM 3.4svn)

Target: x86_64-apple-darwin13.3.0

Thread model: posix

3q,谢谢

0
m
magiclogy

这东西太难试了,愣是试了一个多小时,因为优化的问题,根本无法预料最后出什么结果。。。

为了让优化器少做点事,所以用了不少scanf。main里的Delta,输入上一行显示的即可。i,j均输入0。

另外,编译选项也是个问题。

因为,手边的电脑用的Windows,所以只有MSVC和MingW。
MSVC的cl版本是
用于 x86 的 Microsoft (R) C/C++ 优化编译器 17.00.60610.1 版版权所有(C) Microsoft Corporation。保留所有权利。
编译指令(优化级别必须是O1):

cl /O1 main.c



MingW的gcc版本是
gcc (rubenvb-4.6.3) 4.6.3
编译指令(我知道没有O4这种东西,但是我真的不会gcc的参数设置):
gcc -std=c99 -O4 -o main.exe test.c



// main.c

#include <stdio.h>
#include <stdlib.h>

#ifdef _WIN32
#ifdef __MINGW32__
int f(int* restrict x, int* restrict y)
#else
int f(int* __restrict x, int* __restrict y)
#endif
#else
int f(int* restrict x, int* restrict y)
#endif
{
    int i, j;
    scanf("%d %d", &i, &j);
    x[i + 1] = 2;
    y[j] = 1;
    return x[i + 1];
}

int g(int* x, int* y)
{
    int i, j;
    scanf("%d %d", &i, &j);
    x[i + 1] = 2;
    y[j] = 1;
    return x[i + 1];
}

int main(void)
{
    int i;
    int x[3];
    int d;
    int delta;
    int e;
    printf("Delta is:%d\n", ((int)(&(x[1])) - (int)(&d)) / sizeof(int));
    scanf("%d", &delta);

    printf("Call function f(int* restrict, int* restrict)\n");
    i = 0; d = 0; x[0] = 0; x[1] = 1; x[2] = 2;
    printf("Address: %d %d\n", &(x[1]), &d + delta);
    e = f(x, &d + delta);
    printf("Result is: %d\n", e);

    printf("Call function g(int*, int*)\n");
    i = 0; d = 0; x[0] = 0; x[1] = 1; x[2] = 2;
    printf("Address: %d %d\n", &(x[1]), &d + delta);
    e = g(x, &d + delta);
    printf("Result is: %d\n", e);

    printf("Call function f(int* restrict, int* restrict)\n");
    i = 0; d = 0; x[0] = 0; x[1] = 1; x[2] = 2;
    printf("Address: %d %d\n", &(x[1]), &d + delta);
    e = f(x, &d + delta);
    printf("Result is: %d\n", e);

    printf("Call function g(int*, int*)\n");
    i = 0; d = 0; x[0] = 0; x[1] = 1; x[2] = 2;
    printf("Address: %d %d\n", &(x[1]), &d + delta);
    e = g(x, &d + delta);
    printf("Result is: %d\n", e);

    return 0;
}



0
大婶不是大神

引用来自“magiclogy”的评论

这东西太难试了,愣是试了一个多小时,因为优化的问题,根本无法预料最后出什么结果。。。

为了让优化器少做点事,所以用了不少scanf。main里的Delta,输入上一行显示的即可。i,j均输入0。

另外,编译选项也是个问题。

因为,手边的电脑用的Windows,所以只有MSVC和MingW。
MSVC的cl版本是
用于 x86 的 Microsoft (R) C/C++ 优化编译器 17.00.60610.1 版版权所有(C) Microsoft Corporation。保留所有权利。
编译指令(优化级别必须是O1):

cl /O1 main.c



MingW的gcc版本是
gcc (rubenvb-4.6.3) 4.6.3
编译指令(我知道没有O4这种东西,但是我真的不会gcc的参数设置):
gcc -std=c99 -O4 -o main.exe test.c



// main.c

#include <stdio.h>
#include <stdlib.h>

#ifdef _WIN32
#ifdef __MINGW32__
int f(int* restrict x, int* restrict y)
#else
int f(int* __restrict x, int* __restrict y)
#endif
#else
int f(int* restrict x, int* restrict y)
#endif
{
    int i, j;
    scanf("%d %d", &i, &j);
    x[i + 1] = 2;
    y[j] = 1;
    return x[i + 1];
}

int g(int* x, int* y)
{
    int i, j;
    scanf("%d %d", &i, &j);
    x[i + 1] = 2;
    y[j] = 1;
    return x[i + 1];
}

int main(void)
{
    int i;
    int x[3];
    int d;
    int delta;
    int e;
    printf("Delta is:%d\n", ((int)(&(x[1])) - (int)(&d)) / sizeof(int));
    scanf("%d", &delta);

    printf("Call function f(int* restrict, int* restrict)\n");
    i = 0; d = 0; x[0] = 0; x[1] = 1; x[2] = 2;
    printf("Address: %d %d\n", &(x[1]), &d + delta);
    e = f(x, &d + delta);
    printf("Result is: %d\n", e);

    printf("Call function g(int*, int*)\n");
    i = 0; d = 0; x[0] = 0; x[1] = 1; x[2] = 2;
    printf("Address: %d %d\n", &(x[1]), &d + delta);
    e = g(x, &d + delta);
    printf("Result is: %d\n", e);

    printf("Call function f(int* restrict, int* restrict)\n");
    i = 0; d = 0; x[0] = 0; x[1] = 1; x[2] = 2;
    printf("Address: %d %d\n", &(x[1]), &d + delta);
    e = f(x, &d + delta);
    printf("Result is: %d\n", e);

    printf("Call function g(int*, int*)\n");
    i = 0; d = 0; x[0] = 0; x[1] = 1; x[2] = 2;
    printf("Address: %d %d\n", &(x[1]), &d + delta);
    e = g(x, &d + delta);
    printf("Result is: %d\n", e);

    return 0;
}



3q  辛苦了

返回顶部
顶部