相关疑难解决方法(0)

508
推荐指数
8
解决办法
5万
查看次数

我怎样才能省去对幂等函数的额外调用?

有没有办法告诉gcc,如果两个后续调用具有相同的参数,则只应调用一次具有副作用的函数.我想要以下行为:

foo(6);//run this function
foo(6);//optimize this away
foo(6);//optimize this away
foo(5);//run this function
foo(6);//run this function again
Run Code Online (Sandbox Code Playgroud)

我可以foo在做任何工作之前检查一个全局变量,但这不是最佳的.

void inline foo(int i){
   static int last_i=i+1;
   if(last_i != i){
        last_i==i;
        //do_work...
    }
}
Run Code Online (Sandbox Code Playgroud)

由于foo是内联函数,编译器应该能够查看调用,foo()并看到它不必执行它.问题是编译器不能像全局变量那样优化,有没有办法让编译器知道这样做是否安全?

c c++ gcc

8
推荐指数
3
解决办法
425
查看次数

矩阵不是零填充声明

当我偶然发现这种"怪异"的行为时,我试图在另一个函数中调试我的代码.

#include <stdio.h>

#define MAX 20

int main(void) {
    int matrix[MAX][MAX] = {{0}};

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果我在该return 0;行上设置断点并使用Code :: Blocks查看局部变量,则矩阵不会完全用零填充.第一行是,但数组的其余部分只包含随机垃圾.

我知道我可以做一个双for循环来手动将所有内容初始化为零,但不是C标准应该用{{0}}初始化程序将此矩阵填充为零?

也许是因为这是漫长的一天,我很累,但我可以发誓,我知道这一点.

我试着用不同的标准(与代码::块捆绑编译gcc编译): ,,-std=c89 但它是相同的.-std=c99std=c11

有什么不妥的想法?你能解释一下吗?

编辑:我特别询问{{0}}初始化程序.

我一直认为它会将所有列和所有行填充为零.

编辑2:我特别困扰Code::Blocks和捆绑GCC.其他评论说该代码适用于不同的平台.但为什么它对我不起作用?:/

谢谢.

c gcc c99 codeblocks c89

5
推荐指数
1
解决办法
111
查看次数

C中未初始化数组中char的默认值是多少?

鉴于以下声明:

char inputBuffer[12];

数组中任何一个char的默认值是多少?我很想知道这一点,因为如果我想在数组中清除一个位置,我需要知道给它的价值.

c arrays initialization char

4
推荐指数
2
解决办法
5086
查看次数

在C中初始化静态变量

可能重复:
C中静态变量的初始化

我知道全局变量或静态在C中自动初始化为零.但是,我不确定是否只有一个或者只有一个被初始化.请注意,我不是在讨论函数中定义的变量,而是在.c文件中全局讨论变量.

那么以下哪个变量会自动初始化为零?

static struct mystruct var1;
struct mystruct var2;
static struct { int x; int y; } var3;
Run Code Online (Sandbox Code Playgroud)

c initialization global-variables static-variables

2
推荐指数
1
解决办法
8386
查看次数

联盟初始化

管理联合的未初始化字节的规则是什么?(假设有些是初始化的)

下面是一个32字节的并集,我通过第一个成员初始化前16个字节.似乎剩余的字节是零初始化的.这对我的用例很有用,但我想知道这背后的规则是什么 - 我在期待垃圾.

#include <cstdint>
#include <iostream>

using namespace std;

union Blah {
   struct {
      int64_t a;
      int64_t b;
   };
   int64_t c[4];
}

int main()
{
   Blah b = {{ 1, 2 }}; // initialize first member, so only the first 16 bytes.

   // prints 1, 2, 0, 0 -- not 1, 2, <garbage>, <garbage>
   cout << b.c[0] << ", " << b.c[1] << ", " << b.c[2] << ", " << b.c[3] << '\n';

   return 0;
}
Run Code Online (Sandbox Code Playgroud)

我已经编译了GCC …

c++ initialization unions

2
推荐指数
1
解决办法
1460
查看次数