相关疑难解决方法(0)

restrict关键字是否在gcc/g ++中提供了显着的好处?

有没有人见过任何关于restrictgcc/g ++实际使用C/C++ 关键字的数字/分析是否能在现实中提供任何显着的性能提升(而不仅仅是在理论上)?

我已经阅读了各种推荐/贬低其使用的文章,但我没有碰到任何实际数字,实际上证明了任何一方的论点.

编辑

我知道这restrict不是C++的正式部分,但它得到了一些编译器的支持,我读过Christer Ericson的一篇论文,强烈推荐使用它.

c c++ gcc g++ restrict-qualifier

46
推荐指数
3
解决办法
1万
查看次数

这种类型是否很明确?

我的结构如下.

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)

c language-lawyer

14
推荐指数
2
解决办法
1130
查看次数

允许 struct 字段溢出到下一个字段

考虑以下简单示例:

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 的字段 。之后的下一个字段codeplace_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)

c gcc struct compiler-optimization loop-unrolling

8
推荐指数
2
解决办法
538
查看次数