我遇到了“堆栈初始化”的性能问题。我正在使用优化Visual Studio 2015
(速度)的/O2
编译我的代码。
见以下结构:
template<typename T, size_t SIZE = 0>
TYPE SimpleArray;
template<typename T>
TYPE SimpleArray<T, 0> {
public:
size_t _size;
T * _ptr;
SimpleArray(T * ptr, size_t size) : _size(size) , _ptr(ptr) {}
SimpleArray() : _ptr(0), _size(0) {}
};
template<typename T, size_t SIZE>
TYPE SimpleArray : public SimpleArray<T> {
public:
T _array[SIZE];
SimpleArray() : SimpleArray<T>(_array, SIZE) {}
};
我试图通过以下方式衡量绩效:
template<size_t SIZE>
void test() {
Stopwatch stackWatch;
stackWatch.Start();
for (volatile size_t i = 0; i < 100000000; ++i) {
SimpleArray<char, SIZE> list;
}
stackWatch.Stop();
std::cout << "size\t" << SIZE << "\ttime\t" << stackWatch.ElapsedMilliseconds() << std::endl;
}
我将其描述为小于1MB的尺寸:
template<size_t SIZE = 1>
void invokeTests() { test<SIZE>(); invokeTests<SIZE * 2>(); }
template<>
void invokeTests<(1 << 20)>() {}
int main() {
invokeTests();
return 0;
}
如果我使用class:
#define TYPE class
我获得了我不期望的结果:
size 1 time 204
size 2 time 187
size 4 time 203
size 8 time 219
size 16 time 187
size 32 time 250
size 64 time 688
size 128 time 1422
size 256 time 1719
size 512 time 1859
size 1024 time 2265
size 2048 time 3422
size 4096 time 6063
size 8192 time 10812
size 16384 time 20203
size 32768 time 40953
size 65536 time 141813
...
如果我使用struct:
#define TYPE struct
我获得了以下结果,这正是我所期待的:
size 1 time 203
size 2 time 187
size 4 time 188
size 8 time 187
size 16 time 203
size 32 time 203
size 64 time 188
size 128 time 187
size 256 time 188
size 512 time 187
size 1024 time 188
size 2048 time 187
size 4096 time 203
size 8192 time 188
size 16384 time 187
size 32768 time 188
size 65536 time 187
...
我知道导致性能下降的原因。关于类的性能下降是由“归零”所有_array
元素引起的。
但那是为什么呢? 是错误还是预期行为?
编辑:我发现如果设置了编译器选项/sdl /GS
,就会发生这种情况。然而,仍有同样的问题:为什么VS会在结构和类之间产生差异?