为什么使用带有char的forward_list比使用long long更优化?

LxL*_*LxL 1 c++ optimization list c++11 forward-list

我用下面的代码比较std::liststd::forward_list

#include <iostream>
#include <list>
#include <forward_list>
#include <windows.h>

int main()
{
    LARGE_INTEGER start_;
    LARGE_INTEGER end_;
    LARGE_INTEGER freq;

    QueryPerformanceFrequency(&freq);
    std::list<long long> list;

    QueryPerformanceCounter(&start_);
    for(long long i=0;i<50000000;i++)
        list.push_front(i);
    QueryPerformanceCounter(&end_);


    std::cout<< (end_.QuadPart - start_.QuadPart) / (freq.QuadPart / 1000) <<"\n";
    cin.get();
}
Run Code Online (Sandbox Code Playgroud)

我改了名单forward_list .测量结果的时间和大小:

//long long
//              size    time
//forward list 1157.3  2360
//list         1157.3  2450
Run Code Online (Sandbox Code Playgroud)

我也为此代码做了同样的事情:

int main()
{
    LARGE_INTEGER start_;
    LARGE_INTEGER end_;
    LARGE_INTEGER freq;

    QueryPerformanceFrequency(&freq);
    std::list<char> list;

    QueryPerformanceCounter(&start_);
    for(long long i=0;i<50000000;i++)
        list.push_front('a');
    QueryPerformanceCounter(&end_);


    std::cout<< (end_.QuadPart - start_.QuadPart) / (freq.QuadPart / 1000 )<<"\n";
    std::cin.get();
}
Run Code Online (Sandbox Code Playgroud)

结果:

//char  
//              size  time
//forward list  773   2185
//list          1157  2400
Run Code Online (Sandbox Code Playgroud)

问题是为什么使用std::forward_list whith char比使用long long要好得多std::list.

我知道速度几乎相同,但容器的大小呢?

//long long
//             size(mb)    time
//forward list 1157.3      2360
//list         1157.3      2450


//char  
//              size(mb)  time
//forward list  773       2185
//list          1157      2400
Run Code Online (Sandbox Code Playgroud)

Lig*_*ica 6

首先要注意的是,这几乎没有"好多了".差异完全是微不足道的.

除此之外,我认为复制8个字节需要比复制一个字节稍长一些; 另外,您的常量所需的寄存器/内存没有读取'a',其值可以硬编码到您的可执行文件中.