结构和类之间的C ++差异与VS2015中的初始化有关

时间:2017-03-03 21:03:45

标签: c++ performance visual-studio-2015 compilation

我遇到了“堆栈初始化”的性能问题。我正在使用优化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会在结构和类之间产生差异?