根据引用,simple std::vector<T> vec;创建了一个emtpy容器(默认构造函数).这是否保证没有动态内存分配?或者一个实现可能选择保留一些内存?
我知道,对于这个空构造函数,T自C++ 11以来没有类型的构造.但是,我想知道,如果还保证堆上没有分配任何内容.即上面的行只是nullptr堆栈/成员上的几个.
我用vc140测试了它,它确实没有动态分配.
让我们看一下 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 …