gcc对于restrict到底是怎么支持的? 我明显写的是错的, 为什么编译器不报错。

HONGSEDAIMA1 2010-02-06 10:10:52
测试:
#include <stdio.h>
#include <stdlib.h>

/* 下面pci和pi在引用的时候将指向同一个数据, 编译器应该报错的, 但实际上没有 */
void test( const int *restrict pci, int *restrict pi )
{

( *pi ) += 1;
*pi = ( *pci ) + 2;
return;

}

int main( void )
{

int a = 2;

test( &a, &a );
printf( "%d", a );
return 0;

}

Shell: gcc -Wall test.c -o test -std=c99
编译无错误, 运行无错误。好像restrict这个限定符被略过了。 以为是没加优化的问题, 加入了 -O2, 结果还是没报错, 请高手指点一下。 /* gcc --version => 4.3.2 */
...全文
712 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
HONGSEDAIMA1 2010-02-11
  • 打赏
  • 举报
回复
昏, 居然没人回答了。。。 难道我就这样无答而终? 哎。。。
谭海燕 2010-02-08
  • 打赏
  • 举报
回复
引用 4 楼 hongsedaima1 的回复:
引用 1 楼 brookmill 的回复:
我的理解是,restrict不是要求编译器来检查有没有别人修改这个指针,而是告诉编译器“我保证没有别人会修改这个指针”,而且gcc会很傻很天真的相信。
我把楼主的代码改了一下:
C/C++ code// 用-O2编译,结果输出2;用-O0编译,结果输出5#include <stdio.h>
#include <stdlib.h>int test(int*restrict pci,int*restrict pi )
{
  (*pi )+=1;*pi= (*pci )+2;return*pci;// 如果-O2,编译器会忽略前面两行,直接返回*pci最初的值}int main(void )
{int a=2;
  printf("%d", test(&a,&a) );return0;
}

这位仁兄, 不知道你用的什么版本的GCC啊? 我用的gcc-4.3.2无论用-O2进行优化, 运行结果还是 5。 感觉GCC就是完全无视了 restrict. 还有各位, 我主要想问的就是GCC到底对restrict是什么样的支持,不会就是无视吧。 昏。


顶。gcc4.0.0
结果都是5
HONGSEDAIMA1 2010-02-08
  • 打赏
  • 举报
回复
引用 5 楼 brookmill 的回复:
我用的是cygwin下面的gcc 3.4.4

昏死了。 GCC版本越高居然越退步了。
谭海燕 2010-02-08
  • 打赏
  • 举报
回复
引用楼主 hongsedaima1 的回复:
测试:
#include <stdio.h>
#include <stdlib.h>

/* 下面pci和pi在引用的时候将指向同一个数据, 编译器应该报错的, 但实际上没有 */
void test( const int *restrict pci, int *restrict pi )
{

  ( *pi ) += 1;
  *pi = ( *pci ) + 2;
  return;

}

int main( void )
{

  int a = 2;

  test( &a, &a );
  printf( "%d", a );
  return 0;

}

Shell: gcc -Wall test.c -o test -std=c99
编译无错误, 运行无错误。好像restrict这个限定符被略过了。 以为是没加优化的问题, 加入了 -O2, 结果还是没报错, 请高手指点一下。 /* gcc --version => 4.3.2 */


自己琢磨琢磨。。
brookmill 2010-02-08
  • 打赏
  • 举报
回复
我用的是cygwin下面的gcc 3.4.4
qgw_2000 2010-02-07
  • 打赏
  • 举报
回复
楼上说的没错,restrict是告诉编译器,这块内存在当前scope内只能通过这个指针访问,然后编译器会据此做优化。而编译器不会检查程序是否真的就只通过这个指针访问内存,这需要程序员保证。
HONGSEDAIMA1 2010-02-07
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 brookmill 的回复:]
我的理解是,restrict不是要求编译器来检查有没有别人修改这个指针,而是告诉编译器“我保证没有别人会修改这个指针”,而且gcc会很傻很天真的相信。
我把楼主的代码改了一下:
C/C++ code// 用-O2编译,结果输出2;用-O0编译,结果输出5#include<stdio.h>
#include<stdlib.h>int test(int*restrict pci,int*restrict pi )
{
(*pi )+=1;*pi= (*pci )+2;return*pci;// 如果-O2,编译器会忽略前面两行,直接返回*pci最初的值}int main(void )
{int a=2;
printf("%d", test(&a,&a) );return0;
}
[/Quote]
这位仁兄, 不知道你用的什么版本的GCC啊? 我用的gcc-4.3.2无论用-O2进行优化, 运行结果还是 5。 感觉GCC就是完全无视了 restrict. 还有各位, 我主要想问的就是GCC到底对restrict是什么样的支持,不会就是无视吧。 昏。
brookmill 2010-02-06
  • 打赏
  • 举报
回复
brookmill 2010-02-06
  • 打赏
  • 举报
回复
我的理解是,restrict不是要求编译器来检查有没有别人修改这个指针,而是告诉编译器“我保证没有别人会修改这个指针”,而且gcc会很傻很天真的相信。
我把楼主的代码改了一下:
// 用-O2编译,结果输出2;用-O0编译,结果输出5
#include <stdio.h>
#include <stdlib.h>

int test( int *restrict pci, int *restrict pi )
{
( *pi ) += 1;
*pi = ( *pci ) + 2;
return *pci; // 如果-O2,编译器会忽略前面两行,直接返回*pci最初的值
}

int main( void )
{
int a = 2;
printf( "%d", test(&a, &a) );
return 0;
}

23,223

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧