「スタックの初期化」のパフォーマンスに問題がありました。私はコード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は構造体とクラスの違いですか?
ルックは、クラスと構造体の違いはありません –
を生成しました。なぜコンパイラが構造体の初期化を最適化するのかクラスの初期化を最適化するのはなぜか分かりません。 – NathanOliver
http://stackoverflow.com/a/1191880/1491895には、 'struct'と' class'の違いの説明があります。たぶんあなたの問題はコンストラクターのしくみに関係しているかもしれません。 – Barmar