2
我有“堆栈初始化”性能的问题。我正在使用Visual Studio 2015
编译我的代码,优化/O2
(速度)。结构和类之间的C++区别VS2015中的初始化怎么样
见以下结构:
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;
}
如果我使用等级:
#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
...
,如果我使用的结构:
#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在结构和类之间做了区别?
看代码生成 –
应该有一个类和结构之间没有什么区别。不知道为什么编译器优化了struct case中的初始化,而不是类case。 – NathanOliver
http://stackoverflow.com/a/1191880/1491895对'struct'和'class'之间的区别有很好的解释。也许你的问题与建设者的工作方式有关。 – Barmar