C++ 成对向量和包含两个元素的结构向量的内存布局差异——C++/STL

C++ 成对向量和包含两个元素的结构向量的内存布局差异——C++/STL,c++,memory,stl,C++,Memory,Stl,test1和test2内存中的布局是否相同 std::vector<std::pair<int,int> > test1; std::vector<mystruct> test2; 从逻辑上讲,std::pair也应该这样定义 然而,标准上没有关于这一点的内容,而且完全没有保证。您可以查看编译器中的头文件来确认这一点,但这并不能证明什么 注意:如果你认为不这样做是荒谬的,我可以给你一个例子,说明如何以其他方式定义它。想象一下,在使用std::pa

test1
test2
内存中的布局是否相同

std::vector<std::pair<int,int> > test1;
std::vector<mystruct>       test2;

从逻辑上讲,
std::pair
也应该这样定义

然而,标准上没有关于这一点的内容,而且完全没有保证。您可以查看编译器中的头文件来确认这一点,但这并不能证明什么


注意:如果你认为不这样做是荒谬的,我可以给你一个例子,说明如何以其他方式定义它。想象一下,在使用
std::pair
的其他stl模板类中,他们觉得在对中有一个指向包含该对的节点的指针是很方便的(无论出于何种原因)。这样,他们就可以在不违反任何规则的情况下,在内部添加指向pair类的指针。你的假设会造成大破坏。我想说,他们不太可能做这样的事情,是的,但只要他们不被迫这样做,任何事情都可能发生。

如果你在cplusplus.com上看到,你会看到这是一对的结构:

template <class T1, class T2> struct pair
{
  typedef T1 first_type;
  typedef T2 second_type;

  T1 first;
  T2 second;
  pair() : first(T1()), second(T2()) {}
  pair(const T1& x, const T2& y) : first(x), second(y) {}
  template <class U, class V>
    pair (const pair<U,V> &p) : first(p.first), second(p.second) { }
}
模板结构对
{
类型定义T1第一个_类型;
typedef T2秒_型;
T1优先;
T2秒;
pair():第一个(T1()),第二个(T2()){}
成对(常数T1&x,常数T2&y):第一(x),第二(y){
模板
配对(constpair&p):第一(p.first),第二(p.second){}
}
我想说,完全一样,除了一些事实: 好的,首先是事实,配对和std容器以及所有的,例如,映射是兼容的。 此外,这些对已经生成,并且已经为您提供了构造函数

编辑:
我还忘了提到,您将有std::make_pair,它允许您跳过分配内存并在结构中创建自己的对,并且您还定义了一些比较和赋值运算符。

是的,至少在发布模式下,它的大小相同

但是,您不应该使用这些知识来做一些记忆欺骗,原因有两个:

(一) std使用了很多额外的调试内容。这使得类的大小在调试和发布模式中有所不同。所以很可能是std::pair在调试模式下更大

(二)
性病可能在内部发生变化。无法保证std::pair不会在不同的std版本中更改其内存布局。因此,如果你依赖于这一点,你必须生活在恐惧中,担心有一天它可能不再有效。

在任何合理的
std::pair
实现中,它们将具有相同的布局。但这就引出了一个问题:为什么这很重要?您不应该从一个二进制赋值到另一个二进制赋值

可以直接或通过子类化将副本构造函数添加到结构中。您还可以添加一个方法,以另一种方式进行转换

struct mystruct{
  int a;
  int b;

  mystruct(const std::pair<int,int> &rhs) { a=rhs.first; b=rhs.second; }
  std::pair<int,int> as_pair() { return std::make_pair(a, b); }
 };
struct mystruct{
INTA;
int b;
mystruct(const std::pair&rhs){a=rhs.first;b=rhs.second;}
std::pair as_pair(){返回std::make_pair(a,b);}
};

从理论上讲,但不能保证,我想有什么特别的原因让你想知道吗?@FreakEnum:我能想到的唯一关心这一点的原因是,如果你以后将向量作为数组传递给C函数。
struct mystruct{
  int a;
  int b;

  mystruct(const std::pair<int,int> &rhs) { a=rhs.first; b=rhs.second; }
  std::pair<int,int> as_pair() { return std::make_pair(a, b); }
 };