私はwin32からwin64にいくつかのレガシーコードを移植した後、「データの損失の可能性あり」(What's the best strategy to get rid of "warning C4267 possible loss of data"?)という警告を取り除く最良の戦略は何かを議論した後、私は多くのunsigned int
をsize_t
で私のコードに置き換えようとしています。unsigned intをsize_tに変更するとパフォーマンスに影響が出る可能性がありますか?
しかし、私のコードはパフォーマンスの点で非常に重要です(私はDebugで実行することすらできません...遅すぎます)。だから、明らかに代わりsize_t
を使用して
Elapsed 2756ms
Elapsed 2748ms
:x64のためにコンパイルされた
#include "stdafx.h"
#include <iostream>
#include <chrono>
#include <string>
template<typename T> void testSpeed()
{
auto start = std::chrono::steady_clock::now();
T big = 0;
for (T i = 0; i != 100000000; ++i)
big *= std::rand();
std::cout << "Elapsed " << std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::steady_clock::now() - start).count() << "ms" << std::endl;
}
int main()
{
testSpeed<size_t>();
testSpeed<unsigned int>();
std::string str;
std::getline(std::cin, str); // pause
return 0;
}
、それは出力:x86用のコンパイル
Elapsed 2185ms
Elapsed 2157ms
、それは出力
私は迅速なベンチマークを行いましたunsigned int
のパフォーマンスに与える影響はわずかです。しかし、それは本当に常にそうです(このようにパフォーマンスをベンチマークすることは難しい)。
unsigned int
をsize_t
に変更すると、CPUのパフォーマンスに影響します(現在は64ビットオブジェクトが32ビットではなく操作されるようになります)。
生成されたアセンブリコードを見て、パフォーマンスを測定してみてください。 –
['std :: size_t'](http://en.cppreference.com/w/cpp/types/size_t)は64ビットだと思いますか?実際、その基底型は実装固有のものであり、標準では指定されていません。 – CoryKramer
@CoryKramerでは、OPが 'std :: size_t'ではなく' size_t'を記述しています –