当前位置:  开发笔记 > 编程语言 > 正文

为什么动态创建的对象与对象的大小相差两倍?

如何解决《为什么动态创建的对象与对象的大小相差两倍?》经验,为你挑选了1个好方法。

我编写了代码来创建动态创建对象的链接列表:

#include 
using namespace std;

struct X {
  int i;
  X* x;
};

void birth(X* head, int quant){
  X* x = head;
  for(int i=0;ii = i+1;
    x->x = new X;
    x = x->x;
  }
  x->i = quant;
  x->x = 0;
}

void kill(X* x){
  X* next;
  while(1==1){
    cout << x->i << endl;
    cout << (long)x << endl;
    next = x->x;
    delete x;
    if(next == 0){
      break;
    } else {
      x = next;
    }
  }
}

int main(){
  cout << (long)sizeof(X) << endl;
  X* x = new X;
  birth(x, 10);
  kill(x);
  return 0;
}

这似乎是有效的,除了当你查看每个对象的地址时......

16
1
38768656
2
38768688
3
38768720
4
38768752
5
38768784
6
38768816
7
38768848
8
38768880
9
38768912
10
38768944

尽管X的大小仅为16位,但它们似乎相隔32位.我是如何创建对象的,或者这只是动态分配如何工作的结果?



1> Andrew Henle..:

原因在7.22.3 C标准的内存管理功能中说明:

的顺序和连续调用到所分配的存储的邻接aligned_alloc,calloc,malloc,和realloc功能是不确定的.如果分配成功,则返回指针,以便可以将其分配给指向具有基本对齐要求的任何类型对象的指针,然后用于在分配的空间中访问此类对象或此类对象的数组

由于存储器必须"适当地对齐,以便可以将其分配给指向具有基本对齐要求的任何类型对象的指针",因此malloc 等人返回的存储器倾向于从不同的平台相关倍数开始 - 通常为8或16 - 边界.

而且因为new通常用malloc,这也适用于C++ new.

推荐阅读
谢谢巷议
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有