我知道未初始化的局部变量是未定义的行为(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)
并且还比其他随机数发生器更快?
编译:
#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导致无限循环的答案?,但我仍然不清楚为什么会发生这种情况 - 我认为"未定义"意味着"任何事情都可能发生",但这种特定行为的根本原因是什么?
编译: gcc (4.8)
我正在使用C99下GCC.
我有一个static inline在头文件中声明的函数,我无法修改.
该函数永不返回但未标记__attribute__((noreturn)).
如何以告诉编译器不会返回的方式调用该函数?
我从我自己的noreturn函数调用它,部分想要抑制"noreturn函数返回"警告,但也想帮助优化器等.
我已尝试在属性中包含声明,但会收到有关重复声明的警告.
我已经尝试创建一个函数指针并将该属性应用于该函数,但它表示函数属性不能应用于指向函数.
我正在阅读关于未定义行为的本文,其中一个示例"优化"看起来非常可疑:
Run Code Online (Sandbox Code Playgroud)if (arg2 == 0) ereport(ERROR, (errcode(ERRCODE_DIVISION_BY_ZERO), errmsg("division by zero"))); /* No overflow is possible */ PG_RETURN_INT32((int32) arg1 / arg2);图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)