有没有人见过任何关于restrictgcc/g ++实际使用C/C++ 关键字的数字/分析是否能在现实中提供任何显着的性能提升(而不仅仅是在理论上)?
我已经阅读了各种推荐/贬低其使用的文章,但我没有碰到任何实际数字,实际上证明了任何一方的论点.
编辑
我知道这restrict不是C++的正式部分,但它得到了一些编译器的支持,我读过Christer Ericson的一篇论文,强烈推荐使用它.
我的结构如下.
struct result{
int a;
int b;
int c;
int d;
}
Run Code Online (Sandbox Code Playgroud)
和联盟如下.
union convert{
int arr[4];
struct result res;
}
Run Code Online (Sandbox Code Playgroud)
我输入双关语如下.
int arr1[4] = {1,2,3,5};
union convert *pointer = (union convert *) arr1; // Here is my question, is it well defined?
printf("%d %d\n", pointer->res.a, pointer->res.b);
Run Code Online (Sandbox Code Playgroud) 考虑以下简单示例:
struct __attribute__ ((__packed__)) {
int code[1];
int place_holder[100];
} s;
void test(int n)
{
int i;
for (i = 0; i < n; i++) {
s.code[i] = 1;
}
}
Run Code Online (Sandbox Code Playgroud)
for 循环正在写入code大小为 1 的字段 。之后的下一个字段code是place_holder。
我希望在 的情况下n > 1,写入code数组会溢出并1写入place_holder.
但是,在使用-O2(在 gcc 4.9.4 上但也可能在其他版本上)进行编译时,会发生一些有趣的事情。
编译器识别出代码可能溢出数组code,并将循环展开限制为 1 次迭代。
很容易看出,在编译-fdump-tree-all和查看最后一个树传递(“t.optimized”)时:
;; Function test (test, funcdef_no=0, decl_uid=1366, symbol_order=1)
Removing basic block …Run Code Online (Sandbox Code Playgroud)