我总是不确定,在C++中,restrict关键字是什么意思?
是否意味着赋予函数的两个或更多指针不重叠?还有什么意思?
在gcc-strict-aliasing-and-casting-through-a-union中,我问是否有人遇到过通过指针进行联合惩罚的问题.到目前为止,答案似乎是否定的.
这个问题是广泛的:你有任何关于gcc和严格走样恐怖故事?
背景:引用AndreyT在c99-strict-aliasing-rules-in-c-gcc中的答案:
"严格的别名规则植根于自[标准化]时代开始以来C和C++中存在的标准部分.禁止通过另一种类型的左值访问一种类型的对象的条款存在于C89/90中(6.3 )以及C++ 98(3.10/15)......并非所有编译器都希望(或敢于)强制执行或依赖它.
好吧,gcc现在敢于用它的-fstrict-aliasing开关来做到这一点.这引起了一些问题.例如,请参阅有关Mysql错误的优秀文章 http://davmac.wordpress.com/2009/10/,以及http://cellperformance.beyond3d.com/articles/2006/06/understanding中同样出色的讨论.-strict-aliasing.html.
其他一些不太相关的链接:
重复一遍,你有自己的恐怖故事吗?当然,没有表示的问题-Wstrict-aliasing是优选的.其他C编译器也很受欢迎.
6月2日补充:迈克尔伯尔的答案中的第一个链接,确实有资格作为恐怖故事,可能有点过时(从2003年开始).我做了一个快速测试,但问题显然已经消失了.
资源:
#include <string.h>
struct iw_event { /* dummy! */
int len;
};
char *iwe_stream_add_event(
char *stream, /* Stream of events */
char *ends, /* End of stream */
struct iw_event *iwe, /* Payload */
int event_len) /* Real size of payload …Run Code Online (Sandbox Code Playgroud) 有没有人见过任何关于restrictgcc/g ++实际使用C/C++ 关键字的数字/分析是否能在现实中提供任何显着的性能提升(而不仅仅是在理论上)?
我已经阅读了各种推荐/贬低其使用的文章,但我没有碰到任何实际数字,实际上证明了任何一方的论点.
编辑
我知道这restrict不是C++的正式部分,但它得到了一些编译器的支持,我读过Christer Ericson的一篇论文,强烈推荐使用它.
我意识到我想做的事情并不安全.但我只是在做一些测试和图像处理,所以我的重点是速度.
现在,这段代码为我提供了32位像素值类型的相应字节.
struct Pixel {
unsigned char b,g,r,a;
};
Run Code Online (Sandbox Code Playgroud)
我想检查一下像素是否低于某个值(例如r, g, b <= 0x10).我想我只想条件测试像素的位和位0x00E0E0E0(我可能有错误的字节顺序)来获得暗像素.
我没有使用这个丑陋的混乱(*((uint32_t*)&pixel))来获取32位无符号整数值,而是认为应该有一种方法让我设置它以便我可以使用pixel.i,同时保持使用引用绿色字节的能力pixel.g.
我可以这样做吗?这不起作用:
struct Pixel {
unsigned char b,g,r,a;
};
union Pixel_u {
Pixel p;
uint32_t bits;
};
Run Code Online (Sandbox Code Playgroud)
我需要编辑我现有的代码来说明pixel.p.g绿色字节.如果我这样做会发生同样的情况
union Pixel {
unsigned char c[4];
uint32_t bits;
};
Run Code Online (Sandbox Code Playgroud)
这也可以工作,但我仍然需要更改所有索引到的内容c,这有点难看,但如果我真的需要,我可以使用宏.