2017-03-03 7 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; 
} 

をそして私は1メガバイトよりも小さいサイズのためにそれをプロファイル:

template<size_t SIZE = 1> 
void invokeTests() { test<SIZE>(); invokeTests<SIZE * 2>(); } 
template<> 
void invokeTests<(1 << 20)>() {} 

int main() { 
    invokeTests(); 
    return 0; 
} 

Iの場合使用クラス:

#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

を生成しました。なぜコンパイラが構造体の初期化を最適化するのかクラスの初期化を最適化するのはなぜか分かりません。 – NathanOliver

+1

http://stackoverflow.com/a/1191880/1491895には、 'struct'と' class'の違いの説明があります。たぶんあなたの問題はコンストラクターのしくみに関係しているかもしれません。 – Barmar

答えて

関連する問題