在C中的结构中使用限制指针

6l7fqoea  于 2023-11-16  发布在  其他
关注(0)|答案(1)|浏览(101)

我试图理解在同一个结构中定义的数组上使用restrict关键字的效果。当我比较有和没有restrict指针的情况下的汇编代码时,我看不出有什么区别。我的代码“test_res.c”是:

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

typedef struct 
{
    int index;
    int index2;
    double *restrict a;
    double *restrict b;
    double *restrict c;
} matstruct;

void finalVal (matstruct *m)
{
    int i,j;
    for (j=0; j<m->index2; j++){
        for (i= 0; i<m->index; i++){
            m->b[i] = sqrt(m->a[i]) * sqrt(m->b[i]);
            m->c[i] = sqrt(m->a[i]) + sqrt(m->b[i]); 
            m->c[i] += sqrt(m->a[i]) * sqrt(m->b[i]);
        }
    }
}

int main()
{
    matstruct *m = malloc (sizeof(matstruct));
    m->index = 100000;
    m->index2 = 10000;
    m->a = malloc (sizeof(double)*(m->index));
    m->b = malloc (sizeof(double)*(m->index));
    m->c = malloc (sizeof(double)*(m->index));
    for (int i=0; i<m->index; i++){
        m->a[i] = 10.0+i;
        m->b[i] = 20.0+i;
        m->c[i] = 30.0+i;
    }
    finalVal (m);
    free (m->a);
    free (m->b);
    free (m->c);
    free (m);
    return 0;
}

字符串
我使用以下步骤来获取汇编代码:

  1. gcc -g -O3 -c test_res.c
  2. objdump -S test_res.o > test_res.s
    现在,从代码中删除“restrict”关键字,并使用上述步骤创建另一个汇编代码“test_no_res.s”。最后,比较两个汇编代码。似乎没有区别。
    那么,这是否意味着在结构中使用“restrict”关键字没有效果呢?
bq8i3lrv

bq8i3lrv1#

restrict仅在“指针别名”优化的情况下才有意义。也就是说,编译器无法确定两个指针是否指向当前函数或翻译单元之外的某个对象。如果存在这样做的风险,编译器可能必须对所指向的数据进行额外的副本等。
restrict是程序员和编译器之间的契约,程序员发誓“我保证所指向的数据只通过这个指针访问,并且它也没有指向某个全局变量”。
在你的代码中,指针a、B、c指向哪里并不重要,编译器只需要抓取它们指向的任何东西,复制它并将其传递给sqrt。所以没有明显的理由说明restrict在这里有什么重要的意义。
举一个例子,restrict基于您的代码很重要,但在这个特定的情况下,gcc和clang似乎都没有足够的智慧来利用它。

相关问题