相关疑难解决方法(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万
查看次数

告诉gcc函数调用不会返回

我正在使用C99GCC.

我有一个static inline在头文件中声明的函数,我无法修改.

该函数永不返回但未标记__attribute__((noreturn)).

如何以告诉编译器不会返回的方式调用该函数?

我从我自己的noreturn函数调用它,部分想要抑制"noreturn函数返回"警告,但也想帮助优化器等.

我已尝试在属性中包含声明,但会收到有关重复声明的警告.

我已经尝试创建一个函数指针并将该属性应用于该函数,但它表示函数属性不能应用于指向函数.

c gcc gcc-warning noreturn

24
推荐指数
2
解决办法
6497
查看次数

是否假定C/C++中的所有函数都返回?

我正在阅读关于未定义行为的本文,其中一个示例"优化"看起来非常可疑:

if (arg2 == 0)
    ereport(ERROR, (errcode(ERRCODE_DIVISION_BY_ZERO),
                    errmsg("division by zero")));
/* No overflow is possible */
PG_RETURN_INT32((int32) arg1 / arg2);
Run Code Online (Sandbox Code Playgroud)

图2:意外的优化使src/backend/utils/adt/int8.cPostgreSQL中的除零检查无效.该召唤 ereport(ERROR, :::)将引发异常.

从本质上讲,编译器假定ereport将返回,并删除arg2 == 0,因为分工的存在意味着一个非零分母检查,即arg2 != 0.

这是一个有效的优化吗?编译器是否可以自由地假设函数将始终返回?

编辑:整个事情取决于ereport,因此描述:

   84 /*----------
   85  * New-style error reporting API: to be used in this way:
   86  *      ereport(ERROR,
   87  *              (errcode(ERRCODE_UNDEFINED_CURSOR),
   88  *               errmsg("portal \"%s\" not found", stmt->portalname),
   89  *               ... other errxxx() fields as …
Run Code Online (Sandbox Code Playgroud)

c c++ optimization undefined-behavior language-lawyer

20
推荐指数
2
解决办法
1264
查看次数