2017-03-03 80 views
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在结构和类之间做了区别?

+1

看代码生成 –

+1

应该有一个类和结构之间没有什么区别。不知道为什么编译器优化了struct case中的初始化,而不是类case。 – NathanOliver

+1

http://stackoverflow.com/a/1191880/1491895对'struct'和'class'之间的区别有很好的解释。也许你的问题与建设者的工作方式有关。 – Barmar

回答