スマートポインタへのアクセスのオーバーヘッドを個人的に調べたのですが、ユニークポインタが一番時間がかかるという結果になってしまいました。

raw pointer     13 
shared pointer  311
unique pointer  566

実際には参照カウンタの処理が必要になる分、shared_ptrが一番時間かかると思っていたのですが、これを説明できる方いらっしゃいますでしょうか?

一応ソースも載せておきます
処理内容は、各ポインタの先へ1000万回インクリメントするのを50回繰り返し、その平均を出しています。

#include<Windows.h>
#include<memory>

#pragma comment( lib, "winmm.lib")

void main(void)
{
int loopCount = 10000000;
const int avgNum = 50;
DWORD rawPtrTime = 0, sharedPtrTime = 0, uniquePtrTime = 0; // 各平均時間
DWORD rawPtrTimes[avgNum], sharedPtrTimes[avgNum], uniquePtrTimes[avgNum];
DWORD time = timeGetTime();

int* intPtr = new int(0);
std::shared_ptr<int> intSharedPtr(new int(0));
std::unique_ptr<int> intUniquePtr(new int(0));

// 処理時間算出
for( int avgLoopCnt = 0; avgLoopCnt < avgNum-1 ; avgLoopCnt++){
    // 生ポインタ
    time = timeGetTime();
    for (int i = 0; i < loopCount; ++i) {
        *intPtr += 1;
    }
    rawPtrTime += timeGetTime() - time;

    // std::shared_ptr
    time = timeGetTime();
    for (int i = 0; i < loopCount; ++i) {
        (*intSharedPtr)++;
    }
    sharedPtrTime += timeGetTime() - time;

    // std::unique_ptr
    time = timeGetTime();
    for (int i = 0; i < loopCount; ++i) {
        (*intUniquePtr)++;
    }
    uniquePtrTime += timeGetTime() - time;
}

delete intPtr;
intSharedPtr = nullptr;
intUniquePtr = nullptr;

rawPtrTime /= avgNum;
sharedPtrTime /= avgNum;
uniquePtrTime /= avgNum;


printf( "raw ptr\t\t : %d\n", rawPtrTime);
printf( "shared ptr\t : %d\n", sharedPtrTime);
printf( "unique ptr\t : %d\n", uniquePtrTime);

return ;
}