小编Pub*_*bby的帖子

SSE归一化比简单逼近慢?

我试图规范化4d向量.

我的第一个approch是使用SSE内在函数 - 这为我的向量算法提供了2倍的速度提升.这是基本代码:( v.v4是输入)(使用GCC)(所有内容都是内联的)

//find squares
v4sf s = __builtin_ia32_mulps(v.v4, v.v4);
//set t to square
v4sf t = s;
//add the 4 squares together
s   = __builtin_ia32_shufps(s, s, 0x1B);
t      = __builtin_ia32_addps(t, s);
s   = __builtin_ia32_shufps(s, s, 0x4e);
t      = __builtin_ia32_addps(t, s);
s   = __builtin_ia32_shufps(s, s, 0x1B);
t      = __builtin_ia32_addps(t, s);
//find 1/sqrt of t
t      = __builtin_ia32_rsqrtps(t);
//multiply to get normal
return Vec4(__builtin_ia32_mulps(v.v4, t));
Run Code Online (Sandbox Code Playgroud)

我检查了反汇编,它看起来像我期待的.我没有看到任何大问题.

无论如何,然后我尝试使用近似值:(我从谷歌得到这个)

float x = (v.w*v.w) + (v.x*v.x) + (v.y*v.y) + (v.z*v.z);
float xhalf …
Run Code Online (Sandbox Code Playgroud)

c++ profile sse normalization approximation

6
推荐指数
1
解决办法
1891
查看次数

进行冗余的OpenGL调用

我想知道是否建议消除所有冗余的opengl调用.

例如,我应该做什么(包裹在一个函数中):

if(foobuffer != boundbuffer) {
  glBindBuffer(GL_BAR_BUFFER, foobuffer);
  boundbuffer = foobuffer;
}
Run Code Online (Sandbox Code Playgroud)

或者是驱动程序自动执行此类操作,这实际上是一个冗余的reduntant-check?

c++ opengl buffer driver call

6
推荐指数
1
解决办法
554
查看次数

unsigned关键字可以以非显而易见的方式使用吗?

每次我使用unsigned过之前的关键字int或其他内置类型.我想知道是否还有其他方法unsigned可以使用.

  • 用户定义的类型(类/结构)是否可以使用unsigned关键字?
  • 模板可以特别使用unsigned吗?

如果没有,为什么它有自己的关键字?为什么unsigned intuint呢?

c c++ keyword

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

什么是"替代语法"[[出现在属性之外?

我不明白这个:

(7.6.1)只有在引入属性指定符时才会出现两个连续的左方括号标记.[注意:如果在不允许属性指定的情况下出现两个连续的左方括号,即使括号与替代语法生成匹配,程序也会形成错误. - 尾注] [例子:(略微修改自来源)

// ...
void f() {
int x = 42, y[5];
  // ...
  y[[] { return 2; }()] = 2; // error even though attributes are not allowed
                             // in this context.
}
Run Code Online (Sandbox Code Playgroud)

可以[[使用什么替代语法?如果属性不存在,示例是否有效(示例的作用是什么)?

c++ c++11

6
推荐指数
1
解决办法
366
查看次数

如何在大型c ++ Linux应用程序中检查内存泄漏?

我目前正在开发一个大规模的应用程序项目(用c ++编写),它从一开始就是从头开始,我们已经到了强制要求对内存泄漏进行检查的时候了.

该应用程序在Ubuntu Linux上运行,它具有大量的多媒体内容,并使用OpenGl,SDL和ffmpeg用于各种目的,包括3D图形渲染,窗口,音频和电影播放.您可以将其视为视频游戏,虽然它不是,但通过将其视为视频游戏,可以简化应用程序的职责.

我目前有点无能为力地确定我们是否还有内存泄漏.在过去,我们已经确定了一些,并删除了它们.这些天,应用程序已接近完成,我们运行的测试给了我一些我无法弄清楚的结果.

我做的第一件事是尝试通过Valgrind运行应用程序...不幸的是,当在valgrind环境中运行时应用程序崩溃."非确定性"崩溃,因为它在各个不同的地方崩溃.所以我放弃了Valgrind来轻松识别潜在泄漏的来源,并最终使用了两个Linux命令:free和top.

在应用程序运行时,free用于探测系统内存使用情况

top与'-p'选项一起使用,以在运行时探测应用程序进程内存使用情况.

输出表单top和free将被转储到文件中以进行后处理.我用问题底部链接的数据组成了两个图表.

测试用例非常简单:一旦应用程序启动并等待命令,就会探测有关内存的数据.然后我开始一系列命令,这些命令反复执行相同的操作.该应用程序有望将大量多媒体数据加载到RAM中,然后下载.

不幸的是,图表没有显示我的期望.内存使用量通过3个不同的步骤增长,然后停止.内存显然从未发布,这暗示我有一个巨大的内存泄漏.这将是完全正常的,因为这意味着我们很可能没有释放被媒体吸收的记忆.

但是在前三个步骤之后...内存使用情况稳定......没有更大的步骤......只是轻微的上下,这与预期的数据加载和卸载相对应.这里出乎意料的是,应该加载/卸载的数据占据了百万兆字节的RAM,而不是只有少数兆字节的数据(比如8-10 MB).

我目前在解释这些数据时非常无能为力.

任何人都有一些提示或建议吗?我错过了什么?我用来检查宏观内存泄漏是否存在完全错误的方法?你知道Valgrind以外的任何其他(最好是免费的)工具来检查内存泄漏吗?

系统内存使用情况图

进程内存使用图

c++ linux memory-leaks memory-management

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

OpenGL状态集

这不是一个OpenGL问题,而是一个C++组织问题.

我将要有一个简单的场景图(一个n树),其节点(为了这个问题)将渲染一些几何.更具体地说,它们在draw()方法中都有一些OpenGL绘图命令.

出于优化原因,我想将类似的对象一起批处理并一次性绘制它们.出于这个原因,我想要一种表达我称之为OpenGL的"状态集"的方式.状态集只是一堆OpenGL绑定,或者是在X对象上调用draw之前设置的命令,之后会被取消设置.

因此,状态集至少set()unset()将被渲染系统在使用该状态集的节点的绘制命令之前和之后调用.

我的问题是如何表达状态集?当然有很多功能可以做,但我宁愿能够命名一套并回忆它.类似于节点A具有状态集LIGHTING_AND_SHADOW和节点B具有的状态集CEL_SHADING.

出于这个原因,创建一个抽象类stateSet,它本质上是set()unset()方法的接口,并且每个状态集继承自它似乎是一个好主意.但是,它需要创建一堆对象才能获得一个名称.似乎可能有更好的方法.

理想情况下,我想列出一个stateSets可以轻松召回的清单.例如,在渲染开始之前,能够按照它们对场景图中的所有节点进行排序将是很好的stateSet.

有任何想法吗?

c++ opengl

6
推荐指数
1
解决办法
455
查看次数

类型在编译时已知的虚方法

如果我这样做:

Dog dog; //class with virtual methods
Cat cat; //class from same base as Dog

dog.eat(); //call virtual method
cat.eat(); //call virtual method
Run Code Online (Sandbox Code Playgroud)

然后eat()s将是正常的方法调用,不会要求v表 - 正确吗?我可以假设它会运行与非虚方法相同吗?

(是的,我知道编译器如何处理虚函数不在标准中 - 我想知道大多数编译器的作用)

c++ methods virtual inheritance

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

sizeof... 是否允许在模板参数中进行专门化?

我正在尝试使用 GCC 4.7 快照做一些类似的事情:

\n\n
template <int n, int... xs>\nstruct foo { \n  static const int value = 0;\n};\n\n// partial specialization where n is number of ints in xs:\n\ntemplate <int... xs>\nstruct foo<sizeof...(xs), xs...> { // error: template argument \xe2\x80\x98sizeof (xs ...)\xe2\x80\x99\n                                   //  involves template parameter(s)\n  static const int value = 1;\n};\n\ntemplate <int... xs>\nstruct foo<sizeof(xs), xs...> { // This compiles fine. sizeof(xs) is sizeof int \n                                // even though packs aren't expanded\n  static const int value = 2;\n};\n
Run Code Online (Sandbox Code Playgroud)\n\n

该错误很奇怪,因为在这种情况下, sizeof …

c++ templates sizeof template-specialization c++11

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

模板类中的类型转换运算符 - 无论显式如何都被调用

我有这个代码.在主要我想要使用类型转换,但使用调试我明白在这一行 ob2=(Point2D<double>)ob1;

template <class T1> Point2D(Point2D<T1>& ob)无论explicit以前调用构造函数,template <class T1> explicit Point2D(Point2D<T1>& ob)为什么会发生这种情况?我希望这operator Point2D<T1>()是被调用的.

template <class T>
class Point2D
{
public:
    T x;
    T y;
    Point2D(T _x=0,T _y=0):x(_x),y(_y)
    {
    }
    Point2D(Point2D& ob)
    {
        x=ob.x;
        y=ob.y;
    }
    template <class T1>
    Point2D(Point2D<T1>& ob)
    {
        x=ob.x;
        y=ob.y;
    }
    template <class T1>
    operator Point2D<T1>()
    {
        return Point2D<T1>(x,y);
    }
};
int main()
{
    Point2D<int> ob1(10,10);
    Point2D<double> ob2(20,20);
    ob2=(Point2D<double>)ob1;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

c++ templates type-conversion

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

为什么C++虚拟调用并不比非虚拟调用慢?

在我的理解中,对于C++虚拟调用,它需要:

  1. 从符号表中获取对象的类型
  2. 从类型表中获取v表
  3. 使用v表中的函数签名搜索函数
  4. 调用该函数.

而对于非虚拟(例如在C)呼叫,仅需要#4.

我认为#3应该是最耗时的.鉴于C++中实时覆盖的性质,我看不到上述步骤的编译时间优化的可能性.因此,对于具有长函数签名的复杂类继承,C++虚拟调用应该比非虚拟调用慢得多.

但所有的说法都是相反的,为什么?

c++ performance

5
推荐指数
2
解决办法
1020
查看次数