相关疑难解决方法(0)

未初始化的局部变量是最快的随机数发生器吗?

我知道未初始化的局部变量是未定义的行为(UB),并且该值可能具有可能影响进一步操作的陷阱表示,但有时我想仅使用随机数进行可视化表示,并且不会在其他部分使用它们.例如,程序在视觉效果中设置具有随机颜色的东西,例如:

void updateEffect(){
    for(int i=0;i<1000;i++){
        int r;
        int g;
        int b;
        star[i].setColor(r%255,g%255,b%255);
        bool isVisible;
        star[i].setVisible(isVisible);
    }
}
Run Code Online (Sandbox Code Playgroud)

是不是比它快

void updateEffect(){
    for(int i=0;i<1000;i++){
        star[i].setColor(rand()%255,rand()%255,rand()%255);
        star[i].setVisible(rand()%2==0?true:false);
    }
}
Run Code Online (Sandbox Code Playgroud)

并且还比其他随机数发生器更快?

c c++ undefined-behavior garbage

319
推荐指数
16
解决办法
2万
查看次数

为什么这个循环产生"警告:迭代3u调用未定义的行为"并输出超过4行?

编译:

#include <iostream>

int main()
{
    for (int i = 0; i < 4; ++i)
        std::cout << i*1000000000 << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

gcc产生以下警告:

warning: iteration 3u invokes undefined behavior [-Waggressive-loop-optimizations]
   std::cout << i*1000000000 << std::endl;
                  ^
Run Code Online (Sandbox Code Playgroud)

我知道有一个有符号的整数溢出.

我不能得到的是为什么i价值被溢出操作打破了?

我已经阅读了为什么x86上的整数溢出与GCC导致无限循环的答案,但我仍然不清楚为什么会发生这种情况 - 我认为"未定义"意味着"任何事情都可能发生",但这种特定行为的根本原因是什么?

在线:http://ideone.com/dMrRKR

编译: gcc (4.8)

c++ gcc undefined-behavior

160
推荐指数
5
解决办法
6万
查看次数

在C中生成Segfault的最简单的标准符合方式是什么?

我认为问题就是这么说的.涵盖从C89到C11的大多数标准的示例将是有帮助的.我虽然这个,但我猜它只是未定义的行为:

#include <stdio.h>

int main( int argc, char* argv[] )
{
  const char *s = NULL;
  printf( "%c\n", s[0] );
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

编辑:

正如一些投票要求澄清:我希望有一个程序通常有编程错误(我能想到的最简单的是段错误),这是保证(按标准)中止.这与最小的段错误问题有点不同,它不关心这种保险.

c iso segmentation-fault

58
推荐指数
6
解决办法
2万
查看次数

如果它调用共享库,C++中的无限循环仍然是未定义的行为吗?

据说无限循环for(;;);是未定义的行为.


来自http://en.cppreference.com/w/cpp/language/memory_model

在有效的C++程序中,每个线程最终都会执行以下操作之一:

  • 终止
  • 调用I/O库函数
  • 读取或修改易失性对象
  • 执行原子操作或同步操作

没有执行任何这些可观察的行为,任何执行线程都不能永远执行.

请注意,这意味着具有无限递归或无限循环的程序(无论是作为for语句实现还是通过循环goto或其他方式)具有未定义的行为.


但是如果它在共享库中调用函数呢?

for(;;) sofunc();

该函数可以执行任何类型的阻塞I/O或抛出异常.

在这种情况下,编译器是否假定循环具有一些可观察的行为?

c++ infinite-loop undefined-behavior

12
推荐指数
1
解决办法
1673
查看次数

在GCC中使用-O3有什么缺点吗?

我已经在各种语言中担任了13年的软件工程师,尽管我现在正在进入C和后来的C++.当我正在学习C时,我正在使用GCC编译器来编译我的程序,我想知道是否有使用-O3或其他优化标志的问题.如果没有测试编译的代码,或者在交叉编译期间,我的软件可能会破坏我无法捕获的方式,我可能会无意中混淆了某个不同的平台.

在我盲目地打开这些选项之前,我想知道我能期待什么.此外,由于-Ofast打开了不符合标准的标志,我倾向于不使用它.在我的假设中,我是否正确--Ofast很可能会产生"副作用?"

在发布此问题之前,我已经浏览了https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html.

c c++ gcc

9
推荐指数
3
解决办法
1367
查看次数

在某些条件下非常奇怪的代码,包括优化

我有这段代码:

#include <stdio.h>     

void optimization_headache()    
{    
    int t = 11;    
    int l[1047] = {0};    
    int u_lu[23] = {0};    

    int u = 0;    

    l[0] = 0;    
    l[1] = 0;    

    do {    
        u++;    
        //printf("Incrementing u, now u is %d\n", u);     
        u_lu[u + 1] = u - l[u + 1];    
    } while ((u < t * 2) && (l[u + 1] <= t));    

    printf("u = %d, l[u] = %d, t = %d, u_lu[u] = %d\n", u, l[u], t, u_lu[u]);    
}    

int main()    
{ …
Run Code Online (Sandbox Code Playgroud)

c c++ optimization gcc

8
推荐指数
1
解决办法
168
查看次数

为什么GCC -O2和-O3优化会中断该程序?

我已经编写了此C代码,用于查找等于其数字的阶乘之和的所有整数的总和。在没有任何GCC优化标志的情况下完成该工作大约需要一分钟,使用-O1可以将时间减少约15-20秒,但是当我尝试使用-O2,-O3或-Os时,它陷入了无限循环。

int main()
{
  int i, j, factorials[10];
  int Result=0;

  for(i=0; i<10; i++)
  {
    factorials[i]=1;
    for(j=i; j>0; j--)
    {
      factorials[i] *= j;
    }
  }

  for(i=3; i>2; i++) //This is the loop the program gets stuck on
  {
    int Sum=0, number=i;

    while(number)
    {
      Sum += factorials[number % 10];
      number /= 10;
    }

    if(Sum == i)
      Result += Sum;
  }

  printf("%d\n", Result);  
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

我已查明这for(i=3; i>2; i++)是问题的原因。所以很明显i永远不会小于2?

这与整数溢出行为未定义有关吗?如果是这样,那么有关这些情况下程序究竟发生了什么的更多信息?

编辑:我想我应该提到,我知道其他编写for循环的方法,这样它就不会使用溢出(我希望INT_MAX + 1等于<2的INT_MIN),但这是只是做一个随机测试以查看会发生什么,所以我在这里张贴了它以了解到底发生了什么:)

c optimization gcc integer-overflow infinite-loop

4
推荐指数
1
解决办法
1876
查看次数

为什么这个for循环停止了?

我试图用这个代码为try-catch测试产生一个错误,我希望在访问a[3](第四个)元素时会出错.即使没有得到错误,for循环也必须在五次迭代后停止,这种情况永远不会发生.

int a[3] = {1, 2, 3};
for(int i = 0; i < 5; i++)
{
    std::cout << i << ": " << a[i] << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

输出:

0: 1
1: 2
2: 3
3: 1970756548
4: 4201552
5: 2686800
6: 2130567168
7: 0
8: 0
9: 2686824
10: 4198992
.
.
.
4150: 0
4151: 0
4152: 0
4153: 0
4154: 0
Run Code Online (Sandbox Code Playgroud)

c++ arrays for-loop undefined-behavior

4
推荐指数
1
解决办法
183
查看次数

clang能否在编译时警告未定义的行为?

#include <iostream>

int main()
{
    int n = -1000;
    for (int i(0); i != n; ++i)
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

在gcc中,在编译时捕获以下错误:

main.cpp:6:5: warning: iteration 2147483647u invokes undefined behavior [-Waggressive-loop-optimizations]

     for (int i(0); i != n; ++i)
Run Code Online (Sandbox Code Playgroud)

Clang -fsanitize=undefined是一个运行时机制.clang的编译时间相当于什么?

c++ clang undefined-behavior

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

为什么下面的代码进入无限循环?

调试下面提到的代码进入无限循环的原因

int a[10]; 
int i; 
for(i=0;i<=10;i++) { 
   a[i]=0; 
}
Run Code Online (Sandbox Code Playgroud)

我无法找到任何有效的解释.虽然有一种可能性[9]指向我......但它似乎并不令人信服

c c++ arrays loops

-3
推荐指数
1
解决办法
176
查看次数