小编Joh*_*sie的帖子

是否保证std :: vector默认构造不会调用new?

根据引用,simple std::vector<T> vec;创建了一个emtpy容器(默认构造函数).这是否保证没有动态内存分配?或者一个实现可能选择保留一些内存?

我知道,对于这个空构造函数,T自C++ 11以来没有类型的构造.但是,我想知道,如果还保证堆上没有分配任何内容.即上面的行只是nullptr堆栈/成员上的几个.

我用vc140测试了它,它确实没有动态分配.

c++ memory-management stdvector

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

GLSL:为什么本地数组中的随机写入比循环写入慢得多?

让我们看一下 GLSL 中的简化示例函数:

void foo() {
    vec2 localData[16];
    // ...
    int i = ... // somehow dependent on dynamic data (not known at compile time)
    localData[i] = x; // THE IMPORTANT LINE
}
Run Code Online (Sandbox Code Playgroud)

它将一些值写入x本地数组中动态确定的索引。现在,将该行替换localData[i] = x;

for( int j = 0; j < 16; ++j )
    if( i == j )
        localData[j] = x;
Run Code Online (Sandbox Code Playgroud)

使代码明显更快。在几个测试示例(不同的着色器)中,执行时间几乎减半,并且发生的事情比此写入要多得多。

例如:在与顺序无关的透明度着色器中,除其他外,它获取 16 个纹素,计时采用39ms直接写入和23ms循环写入。其他什么都没变!

测试硬件是GTX1080。返回的程序集glGetProgramBinary仍然太高级。它在第一种情况下包含一行,在第二种情况下包含一个循环+if 围绕相同的行。

  • 为什么会出现这个性能问题?
  • 对于所有供应商来说都是如此吗?

猜测:localData存储在 8 个 vec4 …

performance gpu glsl compiler-optimization

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