【问题标题】:How are pairs stored in memory in C++?在 C++ 中,对如何存储在内存中?
【发布时间】:2022-01-16 16:25:15
【问题描述】:

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

【问题讨论】:

  • 在 C++ 中,数组或数组对按字面意思存储。您还可以拥有一对数组 (std::pair<std::array<T1, N1>, std::array<T2, N2>>),但这是一种完全不同的类型,具有不同的内存布局。特别是,由于后者包含两个数组,所以这两个数组可以有不同的大小。

标签: c++ arrays memory-management iteration key-pair


【解决方案1】:

看看这个例子:

#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

在本例中,每个pair对象由两个chars组成,因此大小为2字节。 arrayOfPairs10 对对象的空间,这意味着它的大小是 10 * 2 == 20 字节。在std::pair 对象中,键和它的值彼此并排存储。它就像一个简单的结构体。

【讨论】:

  • 这如何回答这个问题?
  • 如果没有错,“连续”位会产生误导。在标准 C++ 用语中,“连续”的意思是“没有填充”。也就是说,第二个对象的地址是第一个子对象的地址加上第一个子对象的大小。由于对齐,这通常无法保证。 pair&lt;char,int&gt; 可能有内部填充。
  • @MSalters 是的。是的,在我的编译器上,pair&lt;char, int&gt; 的大小是 8 个字节而不是 5 个。
  • 但这并不能解释如何存储一对
  • @Vasu saini “如何存储一对”是什么意思?
【解决方案2】:

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

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

现在,所有样板文件都在那里,以确保以最小的开销执行所有特殊功能,如比较、分配、复制构造等。 但是为了心理模型,可以考虑这个简单的结构。

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

    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

【讨论】:

    猜你喜欢
    • 2010-09-29
    • 1970-01-01
    • 1970-01-01
    • 2012-06-28
    • 2012-08-25
    • 1970-01-01
    • 1970-01-01
    • 2018-04-20
    • 1970-01-01
    相关资源
    最近更新 更多