什么是"序列点"?
未定义的行为和序列点之间的关系是什么?
我经常使用有趣和复杂的表达方式a[++i] = i;,让自己感觉更好.我为什么要停止使用它们?
如果您已阅读此内容,请务必访问后续问题重新加载未定义的行为和序列点.
(注意:这是Stack Overflow的C++常见问题解答的一个条目.如果你想批评在这种形式下提供常见问题解答的想法,那么发布所有这些的元数据的发布将是这样做的地方.这个问题在C++聊天室中受到监控,其中FAQ的想法一开始就出现了,所以你的答案很可能被那些提出想法的人阅读.)
我正在开发一个游戏,我发现自己经常检查某些数量是否代表我的世界的向量所接受的索引范围:
if(a >= 0 && a < 16 && b >= 0 && b < 16 && c >= 0 && c < 16 &&
d >= 0 && d < 16 && e >= 0 && e < 16)
{
//do things with vector[a][b][c][d][e]
}
Run Code Online (Sandbox Code Playgroud)
我经常要检查比这更多的条件.有没有办法让这些检查更简洁和/或更容易阅读?
或者,有没有办法可以避免完全进行检查?矢量是16x16x16x16x16; 我可以这么做,如果我给它一个16作为索引,它会做什么,而不是段错误?
我没有在任何地方找到这个特定主题......
我在23个整数的std :: vector中的不同数据上调用nth_element()算法,每秒大约400,000次,更精确的"无符号短"值.
我想提高计算速度,这个特定的调用需要很大一部分CPU时间.现在我注意到,与std :: sort()一样,即使具有最高优化级别和NDEBUG模式(Linux Clang编译器),nth_element函数在探查器中也是可见的,因此比较是内联的而不是函数调用本身.好吧,更多的preise:不是nth_element()但是std :: __ introselect()是可见的.
由于数据的大小很小,我尝试使用二次排序函数PIKSORT,当数据大小小于20个元素时,它通常比调用std :: sort更快,可能是因为函数将是内联的.
template <class CONTAINER>
inline void piksort(CONTAINER& arr) // indeed this is "insertion sort"
{
typename CONTAINER::value_type a;
const int n = (int)arr.size();
for (int j = 1; j<n; ++j) {
a = arr[j];
int i = j;
while (i > 0 && a < arr[i - 1]) {
arr[i] = arr[i - 1];
i--;
}
arr[i] = a;
}
}
Run Code Online (Sandbox Code Playgroud)
然而,这比在这种情况下使用nth_element慢.
此外,使用统计方法是不合适的,比std :: nth_element更快
最后,由于值在0到约20000的范围内,因此直方图方法看起来不合适. …
假设我的程序中有一个非常性能关键的循环,我需要检查一个点是否在矩形内,但我知道在编译时下限始终为0,如下所示: (x >= 0 && y >= 0 && x < width && y < height)
我可以消除前两个比较的类型双关x和y的无符号整数(例如喜欢的东西reinterpret_cast<>()或union用C++),因为符号位将保证任何负数会变成一个unsigned int足够大的失败边界检查?如果是这样,您将如何用C++或其他语言实现它?这样做可以获得任何性能提升吗?
我在"source\common\unicode\utf.h"ICU库(International Components for Unicode)的文件中发现了一个有趣的小问题.钻头用于检查数字是否在特定范围内.
// Is a code point in a range of U+d800..U+dbff?
#define U_IS_LEAD(c) (((c)&0xfffffc00)==0xd800)
Run Code Online (Sandbox Code Playgroud)
我已经想出了幻数(0xfffffc00)来自:
MagicNumber = 0xffffffff - (HighBound - LowBound)
Run Code Online (Sandbox Code Playgroud)
但是,我还发现该公式不适用于每个任意范围.这里有人知道公式在什么情况下有效吗?
还有另外一点是为了检查一个数字是否在特定范围内吗?
我正在学习OpenGL ES 2.0,我想创建一个应用程序来更好地理解它是如何工作的.该应用程序有一组用户可以应用于图像的过滤器(我知道,没什么新的:P).
其中一个过滤器需要两个图像和一个蒙版,它会混合显示它们的两个图像(这里是一个图像,以便更好地解释我想要获得的内容)

目前我真的很困惑,我不知道从哪里开始创造这种效果.我无法理解我必须使用多个纹理和多个FrameBuffers,或者我可以使用单个着色器.
你有什么提示可以帮助我做这个项目吗?
编辑 - - - -
我已经找到了这个解决方案,但是当我用作遮罩线而不是圆圈时,结果实际上是"蹩脚",特别是如果线条被旋转.
precision highp float;
varying vec4 FragColor;
varying highp vec2 TexCoordOut;
uniform sampler2D textureA;
uniform sampler2D textureB;
uniform sampler2D mask;
void main(void){
vec4 mask_color = texture2D(mask, TexCoordOut);
if (mask_color.a > 0.0){
gl_FragColor = texture2D(textureA, TexCoordOut);
}else {
gl_FragColor = texture2D(textureB, TexCoordOut);
}
}
Run Code Online (Sandbox Code Playgroud)
使用Stencil缓冲区或混合可能更好吗?
正如标题所说; inline关键字和#define预处理程序指令之间的区别是什么?
有没有办法优化下面的C代码行(以避免分支)?
if ((i < -threshold) || (i > threshold))
{
counter++;
}
Run Code Online (Sandbox Code Playgroud)
所有变量都是16位有符号整数.优化版本应具有高度可移植性.
我正在读这个问题,这是接受的答案.我阅读了评论,但我无法弄清楚产生优化的原因.
使用以下代码时,为什么在汇编代码中出现分支?
x >= start && x <= end
Run Code Online (Sandbox Code Playgroud)
编辑:
为清楚起见,我想了解接受答案产生的优化原因.据我所知,编译器生成的汇编代码中存在分支.我想了解为什么生成的代码中有一个分支.
我想知道如何在给定的代码中处理瓶颈.
%% Points is an Nx3 matrix having the coordinates of N points where N ~ 10^6
Z = points(:,3)
listZ = (Z >= a & Z < b); % Bottleneck
np = sum(listZ); % For later usage
slice = points(listZ,:);
Run Code Online (Sandbox Code Playgroud)
目前for N ~ 10^6,np ~ 1000和number of calls to this part of code = 1000瓶颈声明总共花费大约10秒,与我的其余代码相比,这是一大块时间.

针对@EitanT请求的索引语句的示例代码的更多屏幕截图

c++ ×6
c ×4
performance ×3
inline ×2
math ×2
optimization ×2
algorithm ×1
c++-faq ×1
find ×1
int ×1
matlab ×1
nth-element ×1
shader ×1
sorting ×1
type-punning ×1