#include <iostream>
#include <string>
#include <cstring>

const int size = 100000000;

static char s_str[size];

std::string test1()
{
    return std::string(s_str);
}

void test2(std::string& s)
{
    s = s_str;
}

int main()
{
    memset(s_str, 'x', size - 1);

    std::string s(s_str);
    clock_t c1, c2, c3, c4, c5, c6;

    // コピー
    c1 = clock();
    for (int i = 0; i < 10; i++) {
        s = static_cast<const std::string&>(test1());
    }
    c2 = clock();

    // ムーブ
    c3 = clock();
    for (int i = 0; i < 10; i++) {
        s = test1();
    }
    c4 = clock();

    // バッファの再利用
    c5 = clock();
    for (int i = 0; i < 10; i++) {
        test2(s);
    }
    c6 = clock();

    printf("コピー : %d\n", static_cast<int>(c2 - c1));
    printf("ムーブ : %d\n", static_cast<int>(c4 - c3));
    printf("再利用 : %d\n", static_cast<int>(c6 - c5));
}
