在 C++ 中,对如何存储在内存中?

How are pairs stored in memory in C++?

我刚刚阅读有关 C++ 中的对的内容时,我突然想到这些对如何存储在内存中以及如何将分配给对象或其他对象的标识符标识为标识符。 请解释包含对的数组如何使用内存来保存对,以及我们如何通过访问每一对来遍历该数组;

看看这个例子:

#include <iostream>
#include <array>
#include <iterator>


int main( )
{
    std::array< std::pair<char, char>, 10 > arrayOfPairs { };
    std::cout << "size of array: " << sizeof( arrayOfPairs ) << "\n\n";

    for ( size_t idx { }; idx < arrayOfPairs.size( ); ++idx) // fill the array with
                                                             // std::pair objects
    {
        arrayOfPairs[ idx ] = std::make_pair<char, char>( 'a', 'b' + idx );
    }

    std::cout << "key" << "   " << "value" << '\n';

    for ( const auto& p : arrayOfPairs ) // print the keys and values
    {
        std::cout << " " << p.first << "      " << p.second << '\n';
    }

    return 0;
}

输出:

size of array: 20

key   value
 a      b
 a      c
 a      d
 a      e
 a      f
 a      g
 a      h
 a      i
 a      j
 a      k

本例中,每对对象由两个char组成,所以大小为2字节。 arrayOfPairs 有 space for 10 对对象,这意味着它的大小是 10 * 2 == 20 字节。在 std::pair 对象中,键和它的值彼此相邻存储。它就像一个简单的结构。

至于这对本身,如果你看一下标准库 source code 你会注意到,在删除所有样板文件之后,最简单的情况 std::pair 是只是一个简单的 class 模板:

template<typename First, typename Second>
struct pair
{
  First first;
  Second second;
};

现在,所有样板文件都已准备就绪,可确保以最小开销执行所有特殊功能,如比较、赋值、复制构造等。 但是为了心智模型,可以想到这个简单的结构。

至于“成对数组”- 我不确定我是否真的理解。 std::array<std::pair<X,Y>, SIZE>/std::vector<std::pair<X,Y>> 的行为与任何其他类型的行为一样,即它将这些对存储在连续的内存块中,故事结束。 迭代也一样,没什么特别的:

    std::array<std::pair<char, int>, 3> pairs{
        std::pair{'a', 1},
        std::pair{'b', 2},
        std::pair{'c', 3}};

    for (const auto& p:pairs){
        std::cout << p.first << " " << p.second << "\n";
    }

demo